Exercice 1 : Forum - Base de données   

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 :

http://127.0.0.1/phpmyadmin

Mysql et PDO

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 :

Petit aperçu de PDO: création d'une instance  

Voici un code pour créer une instance de PDO permettant, par la suite, de requêter un serveur SQL :

mysqlConnect.php
<?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.

Utilisation de l'instance PDO  

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.

requete.php
<?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).

Comment récupérer les données transmises par le serveur SQL  

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 :

Les fonctions PDO pour récupérer les données du serveur

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'
);

Exercice 2 : Forum - Script de connexion à la base de données   

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.

Exercice 3 : Forum - auth.php et la base de données   

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 :

https://phpdelusions.net/pdo

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.

 
© C.G. 2007 - 2025