Sobes.tech
Junior

Qu'est-ce que les requêtes préparées?

sobes.tech IA

Réponse de l'IA

C'est une méthode pour augmenter la sécurité et la performance lors du travail avec des bases de données, lorsque le modèle de requête SQL est envoyé au serveur de la base de données séparément des données elles-mêmes.

Avantages :

  • Protection contre les injections SQL : Les données sont traitées par le serveur de la base de données comme des littéraux, et non comme une partie du code SQL.
  • Performance : Le serveur de la base de données met en cache le plan d'exécution de la requête, ce qui économise du temps lors de l'exécution répétée de la même requête avec des paramètres différents.
  • Confort : Permettent de structurer le code et facilitent le débogage.

Étapes d'exécution d'une requête préparée :

  1. Préparation (Prepare): Le modèle de requête est envoyé au serveur de la base de données pour analyse, vérification de syntaxe et construction du plan d'exécution. Le modèle utilise des espaces réservés pour indiquer les endroits où les données seront insérées.
  2. Liaison (Bind): Les valeurs des variables sont liées aux espaces réservés. Le serveur ne les interprète pas comme du code SQL.
  3. Exécution (Execute): La requête est exécutée avec les valeurs liées.

Exemple d'utilisation d'une requête préparée en PHP avec PDO :

// Connexion à la base de données (exemple)
$dsn = 'mysql:host=localhost;dbname=maBaseDeDonnées';
$user = 'monutilisateur';
$password = 'monmotdepasse';

try {
    $pdo = new PDO($dsn, $user, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die('Erreur de connexion : ' . $e->getMessage());
}

// Préparation de la requête avec des espaces réservés
$stmt = $pdo->prepare("SELECT nom, email FROM utilisateurs WHERE id = :id");

// Liaison de la valeur au espace réservé
$userId = 1;
$stmt->bindParam(':id', $userId, PDO::PARAM_INT);

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

// Récupération des résultats
$user = $stmt->fetch(PDO::FETCH_ASSOC);

if ($user) {
    echo "Nom de l'utilisateur : " . htmlspecialchars($user['nom']) . "<br>";
    echo "Email de l'utilisateur : " . htmlspecialchars($user['email']) . "<br>";
} else {
    echo "Utilisateur avec ID " . htmlspecialchars($userId) . " non trouvé.";
}

Dans cet exemple, :id est un espace réservé nommé. Il est également possible d'utiliser des espaces réservés positionnels (?).

// Préparation de la requête avec espace réservé positionnel
$stmt = $pdo->prepare("SELECT nom, email FROM utilisateurs WHERE id = ?");

// Exécution de la requête avec un tableau de valeurs pour l'espace réservé
$userId = 2;
$stmt->execute([$userId]);

// Récupération des résultats
$user = $stmt->fetch(PDO::FETCH_ASSOC);

if ($user) {
    echo "Nom de l'utilisateur : " . htmlspecialchars($user['nom']) . "<br>";
    echo "Email de l'utilisateur : " . htmlspecialchars($user['email']) . "<br>";
} else {
    echo "Utilisateur avec ID " . htmlspecialchars($userId) . " non trouvé.";
}
?>