FriconiX
Des milliers de pictogrammes gratuits dessinés avec amour !

Cours 5.5. Les requêtes MySQL en PHP

Avant-propos

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.

Syntaxe

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'appeller la méthode exec() de classe PDO (objet $db) :

$sql = "INSERT INTO `users` (`firstname`, `lastname`) VALUES ('Lary', 'Page')";
$db->exec($sql);

Malheuresement, 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.

Requêtes paramétriques

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.

Il convient de privilégier l'utilisation des requêtes paramètriques pour plus de sécurité.

Exercice

À 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).

Voir aussi


Dernière mise à jour : 29/11/2019