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 :
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.
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
.
Quels sont les API PHP permettant d'exécuter des requêtes SQL ?
Quel est l'intérêt d'écrire des requêtes SQL avec le driver PDO ?
À quoi sert la séquence `try ... catch``` ?