Cours 6.4. Connexion MySQL en PHP

PDO ou MySQLi

Il existe deux API permettant la création de requêtes SQL en PHP :

Le choix d'une API est discutable et dans la suite, nous allons utiliser PDO pour deux raisons :

Injection SQL

Une injection SQL est une technique de piratage qui exploite une faille de sécurité sur les sites Internet. La technique consiste à entrer dans un formulaire une commande SQL qui sera ensuite insérée dans la véritable commande SQL.

Supposons une requête de connexion qui sélectionne un utilisateur en fonction de son nom et de son mot de passe :

SELECT uid FROM Users WHERE name = '(nom)' AND password = '(mot de passe)';

un formulaire de connexion permet à l'utilisateur d'entrer son nom et son mot de passe (). Supposons qu'un visiteur malveillant saisisse comme nom d'utilisateur Dupont'; --.

La requête SQL deviendra :

SELECT uid FROM Users WHERE name = 'Dupont'; -- AND password = '(mot de passe)';

En SQL, -- est un commentaire : ici, le mot de passe ne sera pas vérifié et il y a risque qu'un pirate usurpe l'identité d'un autre utilisateur.

Il existe plusieurs techniques permettant de se prémunir de ce rique. Par exemple échapper systématiquement les données saisies par l'utilisateur et/ou utiliser une API avec requêtes paramétrées qui vont séparer les commandes SQL des paramètres. C'est cette deuxième option que nous utiliserons systématiquement dans le cadre de ce cours.

Cet exemple est extrait de la page Wikipedia sur l'injection SQL.

Connexion

Le code suivant permet la connexion à la base de données MySQL. La connexion doit être réalisée une fois avant tout autre requête MySQL :

<?php
// Remplacer par vos identifiants
$servername = "localhost";
$username = "username";
$password = "password";

try 
{
    $db = new PDO("mysql:host=$servername;dbname=myDB", $username, $password);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Connexion réussie";
}
catch(PDOException $e)
{
    echo "Erreur de la connexion : " . $e->getMessage();
    die();
}
?>

Vous noterez que le script ci-dessus contient l'adresse du serveur, le nom d'utilisateur et le mot de passe de la base de données. Ces informations ne doivent jamais être publiques. Vous veuillerez à ce qu'aucun utilisateur ne puisse y accéder.

Vous noterez également l'utilisation du mécanisme de gestion d'erreur de PHP try ... catch, qui permet de poursuivre l'exécution du script en cas d'erreur.

Vous remarquerez que la variable $db est une instance de la classe PDO. Si votre site doit accéder à plusieurs bases de données, vous devez créer autant d'instances que de bases de données. Cette variable doit être conservée tant que vous aurez besoin de communiquer avec la base de données car :

Dans la suite du cours, nous supposerons l'existence de cette variable $db.

Exercice

  1. À l'aide de phpMyAdmin, créez une base de données.
  2. À l'aide de phpMyAdmin, créez un nouvel utilisateur MySQL avec tous les droits.
  3. Utilisez le code PHP ci-dessus pour vous connectez à cette nouvelle base de données.

Quiz

Quels sont les API PHP permettant d'exécuter des requêtes SQL ?

Vérifier Bravo ! Les API les plus fréquentes sont MySQLi et PDO. Essaie encore ...

Quel est l'intérêt d'écrire des requêtes SQL avec le driver PDO ?

Vérifier Bravo ! Les requêtes paramètrées du driver PDO protègent des piratages par injection SQL. Essaie encore ...

À quoi sert la séquence `try ... catch``` ?

Vérifier Bravo ! Si une erreur survient dans la partie try, l'interpréteur redirige dans la partie catch pour gérer proprement l'erreur. Essaie encore ...

Voir aussi


Dernière mise à jour : 17/09/2022