Créez la base de données pour le forum dont vous avez défini le schéma à la séance n°1. Créez ses tables et deux utilisateurs du forum. Pour cela, vous pouvez utiliser les outils de base de données que vous avez vus l’année dernière ou utiliser phpMyadmin, qui devrait probablement être accessible sur votre ordinateur via l’URL :
Il existe plusieurs mécanismes en PHP pour interagir avec un serveur SQL. Mais :
Règle
Dans ce module, on utilisera PDO (PHP Data Objects) pour tout ce qui concerne SQL.
Avantages :
sécurité (« prepared statements »)
facilité d’utilisation (« helpers »)
réutilisabilité (API unifiée pour plusieurs types de bases de données)
applicabilité (compatible avec de nombreuses bases : MySQL, SQLite, Firebird, Oracle, etc.)
Voici un code pour créer une instance de PDO permettant, par la suite, de requêter un serveur SQL :
<?php
// les propriétés indiquant comment se connecter à la base de données
$dsn = "mysql:host=$mysqlHost;" .
"dbname=$mysqlDatabase;" .
"charset=$charset";
// les options
$opt = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false
];
// création de l'instance PDO et connexion à la BD
$PDO = new PDO($dsn, $mysqlLogin, $mysqlPassword, $opt);
?>
Dans ce script, on suppose que l’on a à disposition les variables suivantes :
Variable | Signification |
---|---|
$mysqlHost | L'adresse IP ou le FQDN (Fully qualified domain name) du serveur SQL. |
$mysqlDatabase | Le nom de la base de données sur le serveur SQL. |
$mysqlLogin | Le login pour se connecter au serveur SQL. |
$mysqlPassword | Le mot de passe pour se connecter au serveur SQL. |
$charset | L'encodage utilisé dans la base de données (probablement de l'utf8). |
L’exécution de ce script vous permettra d’obtenir une variable nommée ici $PDO avec laquelle vous pourrez requêter la base.
Pour utiliser votre instance, l’idée consiste à « préparer » votre requête, puis à la faire exécuter sur le serveur et, enfin, à récupérer le résultat.
<?php
// définition de la requête
$query = "SELECT * FROM $mysqlTable WHERE field1=? AND field2 IN (?,?)";
$data = ['f1', 3, 5];
// envoi et exécution de la requête à la base
$statement = $PDO->prepare($query); // préparation (sans transmettre les données)
$exec = $statement->execute($data); // exécution (en transmettant les données)
// récupération du résultat
$resultats = $statement->fetchAll(PDO::FETCH_ASSOC);
// affichages
print_r($resultats);
?>
Attention
Vous pouvez observer que, dans la requête ($query), il y a des ?. Ils remplacent des valeurs/données que l’on aurait dû passer à la requête. Ces dernières se trouvent dans le tableau $data. La requête est donc préparée sans données et celles-ci sont transmises au serveur au moment de l’exécution de la requête. Il est important de procéder ainsi pour limiter le risque d’injections SQL. En effet, ici, c’est PDO qui va s’occuper de transformer les données (par exemple en rajoutant des caractères d’échappement, etc.) afin que les requêtes soient correctes. Imaginons par exemple que :
$query = "SELECT * FROM table where login=$str";
$str = '""; DROP TABLE table;';
L’exécution de la requête telle quelle détruirait la table. Avec PDO, des caractères d’échappement sont ajoutés à $str, ce qui empêche la destruction de la table.
Dans le code de requete.php
ci-dessus, il y a 3 ? dans $query. Ils
correspondent donc aux trois éléments placés dans $data, qui sont spécifiés dans
le même ordre (field1 = f1 par exemple).
Il existe 3 méthodes pour récupérer les données du serveur, suivant que l’on souhaite obtenir une valeur (un nombre par exemple), un enregistrement de la table (par exemple, un tableau contenant les informations sur un utilisateur) ou bien plusieurs enregistrements :
Lorsque l’on utilise fetch ou fetchAll, on récupère un tableau contenant les données qui nous intéressent. On a alors 2 options pour indexer celles-ci dans le tableau :
Option | Signification |
---|---|
PDO::FETCH_NUM | indices = nombres |
PDO::FETCH_ASSOC | indices = noms des champs dans la BD |
Autrement dit :
PDO::FETCH_NUM :
Array (
0 => 'toto',
1 => 'titi'
);
PDO::FETCH_ASSOC :
Array (
'nom' => 'toto',
'prenom' => 'titi'
);
Dans votre projet backend, écrivez le script PHP de création de l’instance PDO,
ainsi que le script de configuration contenant les paramètres de connexion
(le nom du host, de la base, etc.). Personnellement, j’appelle
traditionnellement ces scripts mysqlConnect.php
et config.php
mais vous
pouvez leur donner le nom que vous souhaitez.
Modifiez votre script auth.php
de manière à ce qu’il n’utilise plus de variables
globales pour stocker un login/password correct mais plutôt qu’il se connecte à la base
de données et la requête afin de vérifier le login/password du $_POST.
Pour cela, les fonctions fetchAll, fetchColumn et fetch de PDO vous seront
utiles. Elles sont très bien documentées dans l’URL suivante :
Testez votre script via l’application postman.
Astuce
Après avoir utilisé un fetchAll ou un fetch, faites systématiquement un print_r() du résultat afin de déterminer ce que le serveur mySQL vous a retourné. Cela vous permettra de débugguer aisément votre code. Quand l’affichage du print_r() correspond à ce que vous attendiez, supprimez-le.