Requête préparée

Une requête préparée est une méthode pour sécuriser les requêtes SQL.

Elle permet de séparer les données de la requête SQL elle-même.

Comme pour une cuisiner un plat plutôt que de mélanger tous les ingrédients ensemble et de les cuire en même temps, vous préparez chaque partie en les découpant, en les assaisonnant, puis en les ajoutant un par un à la casserole.

De manière similaire, une requête préparée consiste à décomposer une requête SQL en deux étapes :

  1. Préparation : Dans cette étape, vous écrivez la requête SQL en plaçant des espaces réservés emplacement dans le code où une valeur ou une donnée spécifique sera insérée plus tard (comme :nom ou :âge) à la place des valeurs que vous souhaitez insérer. Cela ressemble à l’étape de préparation de vos ingrédients.
  2. Exécution : Dans cette étape, vous fournissez les valeurs réelles pour chaque espace réservé et exécutez la requête. Cela équivaut à ajouter les ingrédients préparés un par un dans la casserole.

Une requête préparée protège votre application contre les attaques d’injection SQL en s’assurant que les données entrées par l’utilisateur (par exemple, depuis un formulaire web) ne sont pas directement mélangées à la requête SQL.

Exemple d’une requête préparée contenant des erreurs de sécurité

// Connexion à la base de données MySQL avec PDO
try {
    $pdo = new PDO("mysql:host=localhost;dbname=ma_base_de_donnees", "utilisateur", "mot_de_passe");
} catch (PDOException $e) {
    die("Erreur de connexion à la base de données : " . $e->getMessage());
}

// Données à insérer
$nom = "Elise";
$age = 20;

// Préparation de la requête avec un espace réservé ":nom" et ":age"
$stmt = $pdo->prepare("INSERT INTO utilisateurs (nom, age) VALUES (:nom, :age)");

// Association des valeurs aux espaces réservés
$stmt->bindParam(':nom', $nom);
$stmt->bindParam(':age', $age);

// Exécution de la requête
$stmt->execute();

echo "Données insérées avec succès !";

Correction de la requête préparée

<?php
// Configuration sécurisée des informations de connexion à la base de données
$db_host = "localhost";
$db_name = "ma_base_de_donnees";
$db_user = "utilisateur";
$db_pass = "mot_de_passe";

try {
    // Connexion à la base de données MySQL avec PDO en utilisant les informations sécurisées
    $pdo = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Activation des exceptions pour les erreurs PDO
} catch (PDOException $e) {
    die("Erreur de connexion à la base de données. Veuillez réessayer plus tard.");
}

// Données à insérer (peuvent provenir d'un formulaire ou d'une source utilisateur)
$nom = "Elise";
$age = 20;

// Préparation de la requête avec des espaces réservés ":nom" et ":age"
$stmt = $pdo->prepare("INSERT INTO utilisateurs (nom, age) VALUES (:nom, :age)");

// Association des valeurs aux espaces réservés
$stmt->bindParam(':nom', $nom, PDO::PARAM_STR);
$stmt->bindParam(':age', $age, PDO::PARAM_INT); // Utilisation du type de données approprié (entier)

// Exécution de la requête en utilisant try-catch pour gérer les exceptions PDO
try {
    $stmt->execute();
    echo "Données insérées avec succès !";
} catch (PDOException $e) {
    die("Erreur lors de l'insertion des données.");
}
?>

Syn. : requête paramétrée

Les contenus de définition restent publics. Les ressources (outils, grilles, supports) liées à cette fiche sont disponibles dans l’espace membre.