Développement Web

août
28
2010
Le principe des requêtes préparées est de créer un modèle de requête et de l'enregistrer sur notre SGBD. Le modèle est supprimé à chaque fermeture de la connexion avec la base de données. Lorsqu'on exécute une requête, la base de données va l'analyser, la compiler, l'optimiser puis l'exécuter. Le but des requêtes préparées est de ne pas répéter toutes ces actions lorsqu'on exécute des requêtes identiques.
Pour mieux comprendre, prenons un exemple. Je souhaite exécuter une requête d'insertion afin d'ajouter le client « Jean Dupont » dans la base de données. La base de données va alors analyser, compiler, optimiser puis exécuter la requête. Grâce aux requêtes préparées, si avec la même connexion PDO je souhaite ajouter un autre client « Pierre Dubois » (J'utilise la même requête d'insertion, seulement les paramètres sont modifiés, à savoir le nom et le prénom), alors la base de données va directement exécuter la requête car les étapes préliminaires (analyse, compilation et optimisation) ont déjà été effectuées précédemment lors de l'ajout de « Jean Dupont ».
Les avantages de ces requêtes, c'est qu'elles permettent de réduire le temps d'exécution lorsque nous souhaitons exécuter une même requête plusieurs fois.
De plus, les requêtes préparées sont automatiquement protégées contre les injection SQL. En revanche, si on exécute une seule fois une requête préparée, alors son temps d'exécution sera (très) légèrement plus long qu'une requête simple mais vous y gagniez en sécurité.

1-Remplacer les paramètres

Pour construire un modèle de requête, il faut remplacer chaque paramètre par un paramètre précédé de « : » ou d'un point d'interrogation. C'est ceci qui nous permet de nous protéger des injections SQL.
$requete = "INSERT INTO Client (Nom, Prenom) VALUES (:unNom, :unPrenom)";
//ou
$requete = "INSERT INTO Client (Nom, Prenom) VALUES (?, ?)";

2-Préparer la requête

Il faut maintenant préparer la requête
$requete = "INSERT INTO Client (Nom, Prenom) VALUES (:unNom, :unPrenom)";
$stmt = $bdd->prepare($requete);
En cas d'échec, la méthode prepare retourne FALSE.

3-Associer les paramètres à des valeurs/variables

Il faut maintenant remplir les paramètres. Il existe deux solutions pour cela:

Stocker la valeur des paramètres dans un tableau passé en paramètre de la méthode execute()

$requete = "INSERT INTO Client (Nom, Prenom) VALUES (:unNom, :unPrenom)";
$stmt = $bdd->prepare($requete);
$stmt->execute(array(
            ':unNom' =>'Dupont',
            'unPrenom' => 'Jean'
            ));

Utiliser les Binds

Le principe est de lier une variable ou une valeur à un paramètre sans passer par un tableau.

BindValue
On associe le paramètre à une valeur:
$requete = "INSERT INTO Client (Nom, Prenom) VALUES (:unNom, :unPrenom)";
$stmt = $bdd->prepare($requete);
$stmt->bindValue('unNom', 'Dupont');
$stmt->bindValue('unPrenom', 'Jean');
$stmt->execute();
BindParam
On associe le paramètre à une variable. C'est à dire qu'après avoir lié le paramètre et la variable, on peut changer la valeur de la variable, le changement sera prit en compte.
$requete = "INSERT INTO Client (Nom, Prenom) VALUES (:unNom, :unPrenom)";
$stmt = $bdd->prepare($requete);
$nom = 'Dupont';
$prenom = 'Jean';

$stmt->bindParam('unNom', $nom);
$stmt->bindParam('unPrenom', $prenom);

//On ajoute Jean Dupont
$stmt->execute();

//On modifie la valeur des variables
$nom='Duval';
$prenom='Robert';

//On ajoute Robert Duval
$stmt->execute();
Commentaires(6)
Lecture(4141)
Les billets similaires:
La méthode exec() de PDO en PHP
La lecture des données avec PDO en PHP
Les modes de lecture de PDO en PHP
Conversion d'une date et de l'heure MySQL en français
Sécurité avec MySQL et PHP

Commenter le billet:
Auteur:
Email: (facultatif)
Contenu:
Ecrit par Jennifer le 07 août 2013
Par contre comment sa se passe quand on le fait avec un select mais qu'on exécute et affiche le résultat dans deux pages différentes ?
Ecrit par Jennifer le 06 août 2013
Cool, merci beaucoup !
Ecrit par clukic le 06 août 2013
C'est bien ça
try
{
$bdd = new PDO('mysql:host=????;dbname=????', '????', '????');
}
catch (Exception $e)
{
die('Erreur : ' . $e->getMessage());
}
Ecrit par Jennifer le 06 août 2013
$bdd représente quoi? la connexion à la base de donnée?
Merci
Ecrit par popo le 27 juillet 2010
ok cool
merci
Ecrit par momo le 27 juillet 2010
ok merci
Intéressantr ;)
Tous droits réservés © 2010