Formation à PHP - TP4: Synthèse - Premiers développements d'un site
Licence Professionnelle, Université Lyon 1, Bourg-en-Bresse
Le but de ce TP est de développer une esquisse du front office d'un site de vente en ligne, sur le modèle du TP2. Cette fois, toutes les données du site (produits, clients, etc...) sont stockées dans une base de données. On portera en outre une attention toute particulière aux questions de sécurité.
On se reportera en cas de besoin à la documentation officielle de PHP. Les transparents du cours sont également disponibles.
On utilisera de préférence un navigateur de type Netscape ou Mozilla pour tester les différents scripts. En effet, les navigateurs de type Internet Explorer, en cas de rappel de page, délivrent souvent une version cached, masquant ainsi une éventuelle modification de script.
Un compte-rendu au format HTML est demandé individuellement pour chaque étudiant. Il comportera des extraits pertinents de code PHP, ainsi que des commentaires sur ce code (validité, limitation, améliorations, etc...)
Présentation du problème
Il s'agit donc de développer une application de vente en ligne permettant la consultation d'articles et leur achat éventuel. Face à l'ampleur d'une telle tâche, nous nous concentrerons évidemment sur quelques points clés.
En premier lieu, une application de ce type comprend toujours un module front office destiné aux utilisateurs finaux et un module back office spécifiquement dédié aux futurs administrateurs du site, permettant des opérations avancées sur le maintien des bases de données, la gestion des utilisateurs par exemple. Dans le cadre du TP, nous nous focaliserons sur le module front office.
Structure de la base de données
Comme nous l'avons vu dans le TP3, une telle application doit disposer d'une base de données. Puisque la conception en tant que telle d'une base peut facilement être le sujet d' un TP en tant que tel, nous utiliserons un modèle pré-établi. Vous trouverez ci-dessous, un schéma de la base de données. En outre, la structure ainsi que les données pré-remplies de la base vous sont fournies dans un fichier texte, grâce auquel vous pouvez regénérer la base dans PHP MyAdmin. Pour ceci, créez une base de données vide, puis cliquez sur l'onglet "SQL" et passez le fichier texte en paramètre.

Notez que la table CommandeArticle identifie la commande d'un article seulement. En outre, elle est reliée à la table Transaction qui, elle, rend compte de l'ensemble de l'achat (donc éventuellement de plusieurs articles).
Remarquez également la table Catégories qui identifie le type d'article (livre, légumes, etc...). En outre, cette table précise pour chaque catégorie l'unité de mesure associée (kilogramme pour les légumes par exemple). Ainsi, l'attribut prix_unitaire de la table Article est relatif à l'unité de mesure de la catégorie (par exemple le prix unitaire d'une pêche est associé à l'unité de fruit soit le kilogramme).
Attention: pour des questions de configuration, les divers mécanismes relatifs à l'intégrité des clés étrangères ne sont pas implémentés. Ceci signifie, par exemple, qu'il est possible d'initialiser dans CommandeArticle une valeur d'id_article qui n'existe pas dans la table Article. Dans une application "réelle", il est évidemment important que ces mécanismes soit mis en place.
Accès à la base de données
Il est fréquent dans ce genre de développement de ne pas utiliser directement les fonctions PHP d'accès à la base de données, mais de passer par des objets intermédiaires, qui gèrent d'eux-mêmes plusieurs paramètres comme les connexions au serveur de bases de données par exemple. Encore une fois, compte-tenu du temps imparti, nous réutiliserons un objet appelé BD, déjà développé. Sauvegardez le code de cet objet dans un fichier bd.php, que vous incluerez dans chacun des scripts dans lequel vous en aurez besoin, avec include "bd.php".
Vous pourrez ensuite vous connecter de manière transparente à la base de données avec, par exemple:
$db = new DB();
$query = "select * from personne";
$db->query($query);
Le résultat de chaque requête est stocké dans l'attribut de classe $result en écrasant la valeur précédente.
Remarquez que vous devez configurer dans ce fichier certains paramètres comme le serveur de bases de données ou un mot de passe.
Enfin, cet objet vous est proposé pour les besoins du TP, il n'est évidemment pas raisonnable de l'utiliser tel quel dans une application réelle.
Etape 1 - Navigation
Votre application doit permettre de fournir une page d'accueil, qui présente la liste des différents articles, classés par catégorie. En face de chaque article déjà déposé dans le caddie, vous afficherez l'image
. De plus, vous afficherez en face de chaque article un lien qui permet d'afficher sur une nouvelle page (générée dynamiquement), un descriptif de l'objet, ainsi qu'un lien "mettre dans le caddie" ou "enlever du caddie" suivant si l'article y est déjà ou non. En outre, dans le cas où vous affichez le lien "mettre dans le caddie", vous devez afficher un champ de formulaire qui précise la quantité souhaitée. Les traitements enlever / ajouter dans le caddie sont tous effectués dans le même script traitement_caddie.php, qui redirige en cas de succès vers le caddie, en indiquant la nature de l'opération qui vient d'être effectuée.
Enfin, vous écrirez un script caddie.php qui permettra de visualiser le contenu du caddie. Ce script pourra être appelé depuis l'accueil.
Vous trouverez ci-dessous le schéma de navigation résumé. Notez que seuls 4 scripts php sont nécessaires pour réaliser l'ensemble des fonctionalités.

Avant d'implanter les 4 scripts PHP, posez-vous les questions suivantes:
- Repensez la manière de passer les informations relatives au caddie de pages en pages, en utilisant le mécanismes des sessions de PHP. Comment utilisez-vous les variables de sessions PHP?
- Quels traitements doivent être effectués dans le script traitement_caddie.php?
- Puisqu'un seul script article.php traite de la description des articles, il faut lui passer l'article en question. Comment procédez-vous?
- Même question pour le script traitement_caddie.php
- Implanter les 4 scripts PHP en question.
Etape 2 - Validation de la transaction
Nous allons maintenant nous intéresser au cas où l'utilisateur accepte de valider la transaction (c'est-à-dire achète le contenu de son caddie). A partir de la page d'accueil, créez un lien "valider la transaction" qui appelle un script transaction.php. A cette étape de navigation, il est alors indispensable d'authentifier l'utilisateur.
- Que proposez-vous pour authentifier l'utilisateur?
- Implémentez une page login.php qui présente à l'utilisateur un formulaire lui demandant son login et son mot de passe.
- Implémentez une page verification_login.php qui vérifie si le login existe et si le mot de passe correspond, puis redirige vers l'accueil.
Deux cas se présentent alors dans transaction.php: l'utilisateur est déjà authentifié et le script peut continuer ou bien l'utilisateur n'est pas authentifié et il faut le rediriger sur login.php (sans perdre le contenu de son caddie, bien sûr...).
- Comment procédez-vous pour vérifier que l'utilisateur s'est déjà authentifié?
- Implanter le code de transaction.php qui vérifie si l'utilisateur est authentifié et affiche un récapitulatif de la commande: articles, quantité, prix par article et montant total. Cette page doit enfin demander à l'utilisateur (via un lien ou un formulaire) de valider la transaction
- Ecrire un script valide_transaction.php qui met à jour la base de donnée et est appelé si l'utilisateur a bien validé la transaction dans la page transaction.php.
- Si, dans le script valide_transaction.php, vous vous contentez de la question précédente, vous venez de créer un trou de sécurité. Pourquoi? Corrigez.
S'il vous reste du temps
Afin d'enrichir la navigation, inclure dans chaque page un bandeau (en haut, en bas, sur le côté.... comme vous le souhaitez) qui affiche, selon les cas: un lien vers login.php si l'utilisateur n'est pas encore authentifié ou un lien vers un script profil.php qui affiche les informations personnelles de l'utilisateur et lui offre la possibilité de les modifier via un formulaire.
TP du 5/03/2004 - nicolas.zlatoff@liris.cnrs.fr