Contexte

Le site Fâ se situe à Barzan, à 15 kilomètres de Royan et à proximité de Talmont-sur-Gironde, le site archéologique du Fâ abrite une cité antique qui pourrait être la ville de Novioregum (Nouveau royaume), mentionnée dans les itinéraires antiques.

Le musée du site du Fâ abrite près d’un millier d’objets découverts sur le site dans une scénographie originale mêlant textes, maquettes, vidéos et restitutions 3D. Ce site permet de se replonger à l’époque gallo-romaine afin de mieux comprendre le monde de l’archéologie.

En visite libre ou guidée, nous pouvons nous mettre dans la peau d’un habitant Gallo-romain et découvrir les rues et bâtiments restitués à l’aplomb des vestiges antiques, afin de mieux comprendre l’organisation et le fonctionnement de cette agglomération.

Le but du projet sur ce thème était de répondre à une problématique. Cette problématique était que le site mettait trop de temps à encaisser et donner les billets aux clients. Par conséquent,  il fallait un moyen de pouvoir réserver en avance pour un nombre de personnes et une date définie et d’afficher le prix ensuite.

Présentation du site

Tout d’abord, le site est composé d’une entête et d’un pied de page comme ci-dessous.

Sur la page d’accueil, on retrouve tous les horaires d’ouverture du site suivant le mois et les jours fériés.

Le site possède une page qui présente tous les tarifs suivant l’âge des personnes, si c’est un groupe ou non ou s’ils choisissent “l’initiation à l’archéologie“.

Ensuite, nous avons un formulaire qui permet de réserver une entrée pour le site en choisissant une date et en donnant son nom, prénom, son numéro de téléphone, son mail puis en donnant le nombre d’adultes qui seront présents. L’utilisateur peut aussi cocher une case afin de pouvoir renseigner un nombre d’enfants qui vont venir avec lui. De plus, il peut choisir de participer à l’initiation d’archéologie. Ce choix s’appliquera pour toutes les personnes renseignées.

En validant le formulaire, l’utilisateur est redirigé vers une page qui lui indique le prix de sa réservation.

Présentation du code

Ce site web utilise une architecture MVC (Modèle-Vue-Contrôleur). Cette architecture, permet de séparer les tâches métiers de la vue, ce qui facilite la maintenance

Nous allons maintenant nous concentrer sur le contrôleur “Réservation”.

Fichier "index.php"

				
					<?php
			// si aucune information n'est présente dans l'url, le controleur par défaut sera "accueil"
			if (isset($_GET['controleur']))
				$controleur=filter_var($_GET['controleur'], FILTER_SANITIZE_FULL_SPECIAL_CHARS);
			else
				$controleur= "tarif";
                    
            switch ($controleur){
                    case 'tarif'      : include("controleurs/gestionTarif.php"); break;
                    case 'general'  : include("controleurs/gestionGlobale.php"); break;
                    case 'reservation'  : include("controleurs/gestionReservation.php"); break;
                    case 'client'  : include("controleurs/gestionClient.php"); break;
                    case 'payer'  : include("controleurs/gestionPayer.php"); break;
            }
              
                
       ?>
				
			

Ce code correspond qu’à une petite partie du fichier “index.php”. En effet, le reste correspond à la mise en page ce qui n’est pas le plus intéressant. 

Ici, on définit le nom des contrôleurs à utiliser ainsi que le fichier auquel le nom est associé. De plus, on définit un contrôleur de base au cas où il y aurait un bug ou un oubli et qu’aucun contrôleur n’ait été renseigné pour réaliser une action.

Fichier "gestionReservation.php"

				
					<?php
include("modele/BaseReservationDAO.class.php");
include("modele/Reservation.php");
if (isset($_GET['action']))
    $action=filter_var($_GET['action'], FILTER_SANITIZE_FULL_SPECIAL_CHARS);
else 
    $action= "accueil";
    

switch ($action){
    case 'accueil'  : include("vues/accueil.html"); break;
    
    case 'ajouterReservation'  : include("vues/formAjouterUneReservation.html"); break;
    
    case 'ajouterReservationBD'  : $connec = new BaseReservationDAO();
                            $nbA=filter_var($_GET['nbA'], FILTER_SANITIZE_FULL_SPECIAL_CHARS);
                            $nbE=filter_var($_GET['nbE'], FILTER_SANITIZE_FULL_SPECIAL_CHARS);
                            $date=filter_var($_GET['date'], FILTER_SANITIZE_FULL_SPECIAL_CHARS);
                            $id=filter_var($_GET['id'], FILTER_SANITIZE_FULL_SPECIAL_CHARS);
                            $archeo=filter_var($_GET['archeo'], FILTER_SANITIZE_FULL_SPECIAL_CHARS);
                            if($nbE==null){
                                $nbE=0;
                            }
                            if(($nbA+$nbE)>=15){
                                $gr = 1;
                            }
                            else{
                                $gr=0;
                            }
                            $resultat= $connec->ajouterReservation(new Reservation($date, $gr, $nbA, $nbE, $id));
                            $connexionPar=null; //fermeture de la connexion
                            
                            if ($resultat==false) {
                             $message = "Votre réservation n'a pas pu être enregistrée";
                             $statut = "erreur"; 
                             include("vues/message.php");
                            }
                            else {
                                header('location: index.php?controleur=reservation&action=recupNumR&nbA='.$nbA.'&nbE='.$nbE.'&gr='.$gr.'&id='.$id.'&archeo='.$archeo);
                            }
                            break;
				
			

Tout d’abord, on inclut le fichier “BaseReservationDAO.class.php” qui contient les fonctions permettant de récupérer des informations ou d’en ajouter dans la table Réservation présente dans la base de données. Ensuite, on définit une action de base pour pouvoir retourner sur la page d’accueil en cas de problème. 

La première action de ce fichier est d’afficher le formulaire vide pour que l’utilisateur puisse le remplir. 

La deuxième, elle, permet de récupérer des informations présentes dans l’URL. On effectue ensuite un traitement pour vérifier s’il y a des enfants et si c’est un groupe. À noter que toutes les informations du formulaire ne sont pas récupérées ici. En effet, il y a déjà eu un autre traitement dans le contrôleur “gestionClient.php”. Après avoir effectué le traitement des données, on utilise la connexion qu’on a initialisée à la ligne 15 pour ajouter la réservation dans la base de données et on referme la connexion après l’ajout. Si l’ajout s’est bien passé alors on fait une redirection vers un autre contrôleur en lui donnant une autre action. 

Fichier "BaseReservationDAO.php"

				
					<?php
 include "Base.php";
 include "Reservation.php";

class BaseReservationDAO extends Base {

    /**
    * Constructeur de la classe sans paramètre
    * @overrided
    */
    public function __construct() {         
        parent::__construct();
    }
    
    /**
     * Méthode permettant de définir la connexion à la base de données la plus adéquate (droits restreints)
     * selon l'action à réaliser
    */
    private function setConnexionSelonRole(string $role) {
        switch ($role) {
            case "inserer" :   $login="Reservation-inserer";
                                    $mdp="24_ReservatioN_InserT*";
                                    break;
                                
            case "consulter" :   $login="Reservation-lecture";
                                    $mdp="24_ReservatioN_ConsulT*";
                                    break;
        }
        $this->setConnexionBase($login,$mdp);
    } 

    public function ajouterReservation($uneReservation) {
        // connexion à la base de données avec des droits adéquats
        $this->setConnexionSelonRole("inserer");
        $requeteAExecuter = "INSERT INTO reservation(dateR, `groupe0/1`, nbAdulte, nbEnfant, idC) VALUES (:date, :gr, :nbA, :nbE, :idC);";
	    $reqPreparee= $this->prepare($requeteAExecuter);
        $reqPreparee->bindValue(":date",$uneReservation->getDate());
        $reqPreparee->bindValue(":gr",$uneReservation->getGr(),PDO::PARAM_STR);
        $reqPreparee->bindValue(":nbA",$uneReservation->getNbAdult(),PDO::PARAM_STR);
        $reqPreparee->bindValue(":nbE",$uneReservation->getNbEnfant(),PDO::PARAM_STR);
        $reqPreparee->bindValue(":idC",$uneReservation->getClient()->getId(),PDO::PARAM_STR);
	
        $resultatDeLaRequete=$reqPreparee->execute();
        
        if ($resultatDeLaRequete==0) 
            $resultat=false;
        else 
            $resultat=true;
        $resultatDeLaRequete=null;
        
        return $resultat;
    }
				
			

Cette classe possède un constructeur qui permet de créer un objet de la classe parente qui est la classe “Base.php”. Ensuite, la fonction “setConnexionSelonRole” permet de sélectionner un user en fonction de la tâche qui doit être faite. Cela permet de limiter les droits. En effet, un user ne possède qu’un seul droit sur une seule table. Les possibilités d’injection SQL sont donc limitées.

La fonction “ajouterReservation” utilise la fonction “setConnexionSelonRole” avec le rôle “inserer” pour pouvoir ajouter un tuple dans la table Reservation. Elle utilise aussi une requête préparée afin d’éviter les injections SQL par le formulaire. Enfin, elle renvoie le résultat de la requête pour savoir si elle s’est bien passée.

Langages utilisés

Outils utilisés