Quelques rappels sur l'html / css (pdf)

 

 

Cours 1 : Introduction à PHP (pdf)

  1. Introduction
  2. Notions de base en PHP
  3. Les tableaux
  4. Superglobales et variables de session

Cours 2 : Strings, Fonctions, POO (pdf)

  1. Chaînes de caractères
  2. Fonctions
  3. Gestion des fichiers
  4. PHP objet

Cours 3 : Strings, Fonctions, POO (pdf)

  1. Architecture MVC
  2. PHP/MySQL
  3. Connexion utilisateur

Cours 4 : Gestion des accès, failles de sécurité (pdf)

  1. Organisation d'un site en modules / composants
  2. Accès privilégiés
  3. Sécuriser l'accès aux fichiers inclus
  4. Failles principales - Solutions

1. Introduction

Dans ce TP, nous allons mettre en place un schema MVC en php. Nous l'appliquerons au cas d'un site web qui référence des noms de footballeurs français. Dans un premier temps, nous simulerons l'utilisation d'une base de données avec des données statiques. Avant de commencer ce TP, il faut savoir que le MVC web côté serveur n'est articulé de la même manière que le MVC "desktop". La communication et la hiérarchie des composants n'est pas la même, pour la simple raison que le serveur doit attendre une demande du client pour effectuer une action. Le modèle ne peut donc pas directement gouverner la vue, sauf dans le cas de l'AJAX que nous ne traiterons pas dans ce cours.

Le contrôleur sert donc d'interface entre le modèle et la vue. Il appelle le modèle, récupère les informations renvoyées par le modèle et appelle la vue en lui fournissant ces informations. Le contrôleur doit également vérifier les différents paramètres ainsi que gérer les aspects liés à la sécurité.

L'accès à un site web se fait généralement via un unique point d'accès, l'index. Cet index va gérer l'appel aux différentes fonctions du contrôleur selon les actions demandées par le client.

2. Vue

Créez un fichier php nommé vue.php . Ce fichier devra contenir une unique classe, nommée Vue. En php, une classe se déclare comme suit :

class Classe {
   public function __construct () {
   }
}

où le constructeur est la fonction __construct().

Dans cette même classe, créez une fonction affiche_liste ( ) qui affiche une simple liste d'éléments passés en paramètre sous la forme d'un tableau. Prenez le tableau suivant, qui ressemblera aux tableaux issus d'une requête à une base de données afin de construire et tester votre fonction :

$tab = array ( array("id"=>1, "nom"=>"Zidane"), array("id"=>2, "nom"=> "Henry"), array("id"=>3, "nom"=>"Mbappé"), array("id"=>4, "nom"=>"Rami" ));

3. Modèle

Créez un fichier php modele.php et définissez-y une classe Modele. Dans cette classe, définissez une méthode getListe() qui renverra le tableau proposé au dessus. Le retour d'une fonction s'effectue à l'aide de la commande return.

4. Contrôleur

Créez un fichier php controleur.php et définissez-y une classe Controleur. Dans cette classe, définissez une méthode liste() qui fera appel au modèle afin de récupérer le tableau de données à afficher, puis appellera la méthode de la vue pour afficher le tableau. Le contrôleur devra inclure les fichiers modele.php et vue.php afin de pouvoir les utiliser. Dans le constructeur du contrôleur, vous pouvez initialiser la vue et le modèle. Les champs vue et modèle doivent donc être déclarés au préalable dans le corps de la classe. Le code suivant montre un exemple de classe en php qui déclare plusieurs champs et un contrôleur, ainsi qu'un constructeur qui instiancie un des champs. Vous remarquez l'utilisation de $this pour faire appel à l'objet courant. En php, l'utilisation du $this est plus stricte qu'en java. Ne pas indiquer $this-> devant une variable signifie non pas le champ de l'objet en cours mais une nouvelle variable !

class Test {
   private $a;
   public $b;
   protected $c;
   static protected $d;
   public function __construct() {
$this->a = 1; } }

 4. Le point d'accès

Créez un fichier index.php. Ce fichier est le point d'accès du site. Il devra créer un contrôleur et appeler la méthode qui convient. Pour l'instant, il y a un seul contrôleur qui contient une seule méthode. Créez donc un contrôleur et appelez sa méthode.

5. Le débuggage

Ouvrez la page index.php dans votre navigateur. Débuggez :-)

6. On ajoute une fonction !

En plus de l'affichage de la liste des joueurs, nous allons écrire une fonction qui permet d'afficher un message de bienvenue. Il n'y a qu'un seul point d'accès du site ; c'est index.php. Quelle que soit la fonction que l'on cherche à utiliser, il faudra que l'on passe par cet index. Il faudra donc lui passer en paramètre la fonction que l'on cherche à atteindre.

Créez une fonction "menu" dans la vue qui permet d'afficher un menu avec deux liens. Ces liens doivent pointer vers index.php?action=bienvenue et index.php?action=liste 

Dans l'index, récupérez si elle existe la variable $_GET['action'] et stockez-la dans $action. Si $_GET['action'] n'existe pas, donnez à $action la valeur "bienvenue". Ecrivez un switch/case sur la variable $action. Si elle vaut "bienvenue", il faudra appeler une méthode bienvenue du contrôleur. Si elle vaut "liste", il faudra appeler la méthode liste du contrôleur. Ecrivez la méthode bienvenue du contrôleur. N'oubliez pas de faire appel également à la fonction menu afin d'afficher le menu.

7. On ajoute la BDD

Pour gérer la connexion à la base de données, nous allons créer une classe Connexion dont devront hériter tous les modèles que nous créerons. Cette classe doit contenir un champ protégé statique $bdd ainsi qu'une fonction publique et statique initConnexion() qui initialise $bdd de la manière que nous avons vue dans le TP précédent. Attention, pour accéder à un champ statique à l'intérieur d'une classe, on utilise la syntaxe suivante : 

self::$champ

Une fois cette classe créée, vous pouvez en faire hériter la classe Modele. En php, on fait hériter une classe A d'une classe B de la manière suivante :

class A extends class B {
}

Ainsi, le modèle pourra accéder à la base de données à l'aide du champ $bdd. Il faudra penser à faire appel à la méthode init() de Connexion au tout début de l'index.

8. On modifie le modèle !

Maintenant que le modèle hérite de la connexion à la BDD, on peut s'en servir pour récupérer la liste des joueurs depuis une base de données plutôt que de renvoyer un tableau inscrit en dur. Créez une nouvelle table qui contient une liste de joueurs et modifiez la méthode getListe du modèle afin qu'il renvoie les résultats issus d'une requête à cette table.

Attention ! Votre vue est codée de manière à afficher les résultats issus d'un fetchAll(); . Renvoyez donc les résultats d'un fetchAll !

9. On rajoute encore une fonction !

Modifiez votre base de données pour ajouter à chaque joueur une description le concernant. 

Maintenant, on va se servir de la liste des joueurs, qui affiche uniquement leur nom, comme d'un accès à une vue détaillée d'un joueur, qui affiche également la description d'un joueur particulier. Votre index devra donc gérer une action supplémentaire, que vous appellerez "details". Il va donc falloir créer une méthode du contrôleur qui demande au modèle les détails d'un joueur (donc créer une méthode du modèle qui renvoie les détails d'un joueur identifié par sa clé primaire -- son id), et une vue qui affiche uniquement les détails d'un joueur. L'id du joueur dont on demande les détails sera passé par l'url, et doit être récupéré par la méthode du contrôleur qui affiche les détails.

Une fois tout cela fait, les détails du joueur dont l'id est 1 sera accessible par l'url : index.php?action=details&id=1. 

Modifiez l'affichage en liste de manière à ce qu'elle génère des liens vers les détails des joueurs en lieu et place du simple affichage de leur nom.

1. Introduction

Dans ce TP, nous allons ajouter au TP précédent un étage dans l'architecture. Dans le TP précédent, nous avions un site simple dans lequel plusieurs actions pouvaient être réalisées (affichage en liste, affichage des détails) pour un module de gestion de joueurs de foot. Nous allons ajouter à ce site web un module de gestion des équipes de foot. Cela suppose de modifier l'architecture vue précédemment, en y ajoutant un étage : celui des modules. Au lieu d'appeler directement le contrôleur en fonction de l'action demandée par l'utilisateur, l'index devra maintenant appeler un module en fonction de ce qui est demandé par l'utilisateur. Puis ce module, en fonction de l'action demandée par l'utilisateur, fera appel au contrôleur et à ses méthodes.

2. Création des répertoires du site

Créez un répertoire modules. Dans ce répertoire, nous créerons un dossier par module. A l'intérieur de ce répertoire, créez un dossier mod_joueurs.

3. Création du module Joueurs

A l'intérieur du répertoire mod_joueurs, créez un fichier php nommé mod_joueurs.php . Ce fichier devra contenir une unique classe, nommée ModJoueurs. Cette classe sera l'équivalent de l'index vu dans le TP précédent. Elle devra récupérer l'action demandée par l'utilisateur, et appeler la bonne fonction du contrôleur du module joueurs.

Créez maintenant des php nommés cont_joueurs.php, vue_joueurs.php, modele_joueurs.php. Ces fichiers doivent contenir respectivement les classes ContJoueurs, VueJoueurs et ModeleJoueurs. Placez-y les méthodes réalisées dans le TP précédent. Faites en sorte que le fichier ModJoueurs puisse appeler ContJoueurs, et que ContJoueurs puisse appeler VueJoueurs et ModeleJoueurs.

Dans le constructeur de ModJoueurs, placez le switch/case réalisé en TP1, dans l'index, qui permet de choisir la méthode à exécuter en fonction de l'action demandée, et modifiez-le de manière à ce qu'il soit compatible avec notre nouvelle architecture.

3. Modification de l'index

L'index appelait jusqu'ici une méthode en fonction de l'action demandée. Désormais, il devra faire appel au bon module en fonction du module demandé par l'utilisateur. Lisez le chapitre de cours dédié à la sécurité, particulièrement la partie dédiée à l'inclusion de fichiers.

Dans l'index, en fonction d'un paramètre "module" passé par la méthode GET du protocole http, appelez le module idoine. Nous avons bien ajouté l'étage de modules à notre architecture !

4. Ajout du module Equipes

Sur le même modèle que celui de Joueurs, ajoutez un module Equipes. Une équipe sera définie comme suit dans la base de données : id, nom, annee_creation, description (TEXT), pays (UNSIGNED BIGINT), logo (VARCHAR(200))

Sur le modèle du module Joueurs, codez le module Equipes. Celui-ci devra donc afficher une liste des équipes existantes et les détails d'une équipe particulière.

5. Ajout de données à la base

Visualiser des données, c'est bien, les ajouter, c'est encore mieux. Ici, nous allons apprendre à ajouter des données dans la base depuis des formulaires. Attention, parfois certains formulaires devraient être non pas accessibles à tout le monde, mais seulement à un administrateur. Pour le moment, nous n'avons pas encore vu comment gérer les droits, l'ajout sera donc accessible à tout le monde.

Créez une méthode form_ajout dans la vue du module joueurs. Ce formulaire devra passer ses données par la méthode post, à la page index.php?module=joueurs&action=ajout Ainsi, index.php pourra appeler le module joueur, qui appellera la fonction d'ajout du contrôleur, qui récupérera les données passées par la méthode post et appellera le modèle pour ajouter les données.

Vous devez donc créer dans le contrôleur : une fonction form_ajout qui appellera la vue pour afficher le formulaire, une fonction ajout qui appellera le modèle pour ajouter les données et afficher un message de confirmation de la vue.

En PHP, on peut récupérer les données issues d'un formulaire, qui sont placées dans les variables $_GET ou $_POST. La clé qui permet d'accéder aux données correspond au nom donné au champ du formulaire html. Par exemple, le champ suivant :

 

sera récupéré dans la page cible par $_GET["truc"]. 

Mettez en oeuvre ce que l'on vient de voir pour créer le formulaire ainsi que les traitements nécessaires à l'ajout de joueurs.

1. Introduction

Dans ce TP, nous allons ajouter au TP précédent la connexion utilisateur ainsi que le corps html du site web.

 

Lire la suite : TP3 2018/2019