Nous supposerons sur cette page l'existence d'une variable $db
qui contient
les paramètres de connexion à la base de données
qui est créée conformément au code présenté sur la page Connexion MySQL en PHP.
La syntaxe permettant de soumettre une requête MySQL est relativement simple. Il
suffit de créer une chaîne de caractères contenant la requête SQL et d'appeler
la méthode exec()
de classe PDO (objet $db
) :
$sql = "INSERT INTO `users` (`firstname`, `lastname`) VALUES ('Lary', 'Page')";
$db->exec($sql);
Malheureusement, cette syntaxe ne protège pas des injections SQL. Si les valeurs de
la requête (ici Larry
et Page
) proviennent d'un formulaire, elles seront insérées directement dans la
chaîne de caractères.
Pour se prémunir des injections SQL, il convient de séparer les valeurs des commandes SQL. Voici l'exemple précédent avec les valeurs extraites de la requête :
$query = $db->prepare( "INSERT INTO `users` (`firstname`, `lastname`) VALUES (:firstname, :lastname)");
$nom ='Lary';
$query->bindParam(':firstname', $nom);
$query->bindValue(':lastname', 'Page');
$query->execute();
Vous constaterez que la requête ne contient plus les valeurs, mais des labels (ou paramètres)
(:firstname
et :lastname
) qui seront associés à leurs valeurs lorsque la fonction
bindParam
ou bindValue
sera appellée. Ces paramètres doivent commencer par deux points afin que
le moteur MySQL puisse les différencer des commandes ou d'autres valeurs.
bindParam
permet de lier un label à une variablebindValue
permet de lier un label à une constante (typiquement une chaîne de caractères)Il convient de privilégier l'utilisation des requêtes paramètriques pour plus de sécurité.
À l'aide de phpMyAdmin, créez une nouvelle base de données nommée myBase
Exécutez dans phpMyAdmin la commande SQL suivante qui permet de créer une nouvelle table :
CREATE TABLE users (
id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
lastname VARCHAR(100),
firstname VARCHAR(100)
);
Après avoir écrit le code de connexion à la base de données, ajoutez le code suivant :
$prenom = 'Lary';
$nom = 'page';
$sql = "INSERT INTO `users` (`firstname`, `lastname`) VALUES ( '".$prenom."', '".$nom."' )";
$db->exec($sql);
Vérifez dans phpMyAdmin qu'une nouvelle ligne a été créée dans la table users
.
Testez à nouveau avec le code suivant :
$prenom = 'Lary';
$nom = "Page'); DROP TABLE users; -- ";
$sql = "INSERT INTO `users` (`firstname`, `lastname`) VALUES ( '$prenom', '$nom' )";
$db->exec($sql);
Vérifez dans phpMyAdmin qu'une nouvelle ligne a été créée dans la table users
.
Répétez l'exercice avec des requêtes paramétriques (prepare
, bindParam
et execute
).