• Aucun résultat trouvé

Systèmes d’Informa1on & Informa1que

N/A
N/A
Protected

Academic year: 2022

Partager "Systèmes d’Informa1on & Informa1que"

Copied!
27
0
0

Texte intégral

(1)

Systèmes d’Informa1on & Informa1que

PHP Avancé Sessions

Orienta2on à objets

(2)

PHP : Sessions

•   Mécanisme de sessions

–  Chaque visite à un site / page est indépendante

–  Les sessions perme@ent de conserver les informa2ons des visiteurs entre les pages

–  Les informa2ons sur les sessions sont stockées sur le serveur

•  Fonc2onnement général

1)   Ouverture de session : session_start ()

•  Chaque u2lisateur reçoit un iden2fiant transmis entre les pages

2)   Défini2on des variables de sessions (données)

•  Les variables de session sont transmises de page à page

•  $_SESSION["variable"] = valeur ;

3)  Fermeture de session : session_destroy()

Manuele Kirsch Pinheiro - UP1 / CRI / UFR06 Ges2on 2

(3)

PHP : Sessions

Manuele Kirsch Pinheiro - UP1 / CRI / UFR06 Ges2on 3

Login & mdp différents de uml

Login & mdp corrects (uml /uml )

<form name="…"

ac1on="coursPHP-23.php"

method="POST">

<label >Login : </label>

<input type="text" name="login" maxlength="15" /> <br/>

<label >Mot de passe : </label>

<input type="password" name="mdp" maxlength="15" />

<br/>

<input type="submit" value="OK" />

</form>

(4)

PHP : Sessions

Manuele Kirsch Pinheiro - UP1 / CRI / UFR06 Ges2on 4

<?php session_start(); ?>

<html>

<head> … </head>

<body>

<?php . . .

$login = $_POST["login"] ; $mdp = $_POST["mdp"];

if ( $login == "uml" AND $mdp == "uml") {

$_SESSION["login"] = $login ;

echo "<h1>Bienvenue, cher $login </h1>" ; }

else { echo "<h1>Desolé ! </h1>";

echo "<p> Page accessible uniquement aux membres. </p>";

}

?>

</body> </html>

Ouverture d’une session (au début de chaque page)

Défini2on des variables de session

$_SESSION["var"]

Les variables de session con2ennent les informa2ons qui passeront de page en

page.

(5)

PHP : Sessions

Manuele Kirsch Pinheiro - UP1 / CRI / UFR06 Ges2on 5

<?php session_start(); ?>

<html> <head>… </head>

<body>

<?php

if ( isset( $_SESSION["login"] ) AND ! empty( $_SESSION["login"] ) ) { $login = $_SESSION["login"] ;

echo "<p>Client <b> $login </b> : Ceci est une page pour les abonnés </p>" ; }

else { echo "<h1>Desolé ! </h1>";

echo "<p> Il s'agit d'une page privée !! Il faut être membre. </p>";

}

?>

Usage des variables de session

$_SESSION["var"]

(6)

PHP : Sessions

Manuele Kirsch Pinheiro - UP1 / CRI / UFR06 Ges2on 6

<?php session_start(); ?>

<html> <head>… </head>

<body>

<?php

if ( isset( $_SESSION["login"] ) AND ! empty( $_SESSION["login"] ) ) {

unset($_SESSION["login"]);

session_destroy();

}

else { echo "<h1>Desolé ! </h1>";

echo "<p> Pas de connexion ac2ve. </p>";

}

?>

Fermeture de la session session_destroy()

Ne pas oublier de vider les variables de session unset( $_SESSION[ "var" ] )

(7)

Exemple Sessions & BdD

•  Comment relier l’exemple à une vraie BdD ?

–  Réaliser l’authen2fica2on à par2r des

informa2ons (login/mot de passe) qui sont dans la Base de Données

•  Ajouter les étapes pour consulter une BdD

–  on établit la connexion

–  on cherche un u2lisateur avec ce mot de passe dans la BdD (requête)

–  on analyse des résultats obtenus –  on ferme de la connexion

7

(8)

Exemple Sessions & BdD

8

authen1fica1on.php PHP

On récupère les informa2ons de la BdD On ajuste la session en

fonc2on du résultat

(9)

Exemple Sessions & BdD

•  Algorithme « authen2fica2on »

9

Authentification

internautesystème

afficher formulaire

renseigner login et mdp

récupérer login du formulaire

récupérer mdp du formulaire

ouvrir connexion avec BdD

rechercher un user avec ce login et ce mdp

ajouter info user dans la session afficher message

d'erreur

afficher page membre

Si [pas de

user]

[ user retrouvé ]

Powered By Visual Paradigm Community Edition

(10)

Exemple Sessions & BdD

10

Authentification

internautesystème

afficher formulaire

renseigner login et mdp

récupérer login du formulaire

récupérer mdp du formulaire

ouvrir connexion avec BdD

rechercher un user avec ce login et ce mdp

ajouter info user dans la session afficher message

d'erreur

afficher page membre

Si [pas de

user]

[ user retrouvé ]

Powered By Visual Paradigm Community Edition

$login = $_POST["login"] ;

$mdp = $_POST["mdp"] ;

$mysqli = new mysqli ( … ) ;

requête SQL avec WHERE login = login donné ET mdp = mdp donné

(11)

Exemple Sessions & BdD

Manuele Kirsch Pinheiro - UP1 / CRI / UFR06 Ges2on 11

<?php session_start(); ?>

<html>

<head> … </head>

<body>

<?php . . .

$login = $_POST["login"] ; $mdp = $_POST["mdp"];

$user="uml";

$host="localhost";

$password="uml";

$database="Produits";

$mysqli = new mysqli ( $host, $user, $password, $database ) ;

if ($mysqli->connect_errno) {

die ("Echec lors de la connexion à MySQL : " . $mysqli->connect_error);

}

Début de la page reste le même

Avant de définir le $_SESSION, on va ouvrir la connexion avec la BdD

et rechercher un user avec ce login

1ère étape : ouverture de connexion

(12)

Exemple Sessions & BdD

Manuele Kirsch Pinheiro - UP1 / CRI / UFR06 Ges2on 12

. . .

$sql = "SELECT * FROM client " .

" WHERE email='".$login . "' AND mdp='".$mdp."'” ;

$result = $mysqli->query($sql);

if ( $result->num_rows > 0 ) {

$_SESSION["login"] = $login ;

echo "<h1>Bienvenue, cher $login </h1>" ; }

else { echo "<h1>Desolé ! </h1>";

echo "<p> Page accessible uniquement aux membres. </p>";

}

$mysqli->close();

?>

apen1on aux « ' » avant et après les valeurs

Si on a des résultats, on a notre user…

un user avec ce login et ce mdp

2ème étape : la requête SQL

3ème étape : les résultats

4ème étape : fermer la connexion

(13)

PHP : Orienta1on à objets

•  Comment mieux organiser son code ?

–  Les mêmes lignes de code se répètent sur plusieurs pages PHP

•  connexion

•  afficher les résultats

•  panier

💡 Créer des classes !

13

(14)

PHP : Orienta1on à objets

•  PHP est un langage « orienté objets »

Manuele Kirsch Pinheiro - UP1 / CRI / UFR06 Ges2on 14

<?php

class CompteClient { private $email;

private $mdp;

private $nom;

private $adresse;

public func1on __Set($apr, $val) { $this->$apr = $val ;

}

public func1on __Get($apr) { return $this->$apr ; ...

}

Défini2on de classe class CompteClient

Défini2on d’un a@ribut Visibilité :

private $nom

get/set magiques __Set

__Get

Retourner une valeur return valeur ;

Opéra2on :

public func1on…

(15)

PHP : Orienta1on à objets

•  Classes & objets

Manuele Kirsch Pinheiro - UP1 / CRI / UFR06 Ges2on 15

<?php . . .

require "CompteClient.php";

$user = new CompteClient();

$user->email = $_POST["login"];

$user->mdp = $_POST["mdp"];

if ( $user->chercheUserMdP() > 0 ) { $_SESSION["login"] = $user->email ; …

On importe la défini2on de la classe CompteClient

$user est un objet CompteClient

On peut accéder à ses apributs (set / get « magiques »)

On peut invoquer les opéra1ons de la classe

CompteClient

(16)

PHP : Orienta1on à objets

Manuele Kirsch Pinheiro - UP1 / CRI / UFR06 Ges2on 16

<?php

class CompteClient { . . .

func1on chercheUserMdP () {

include "connexionOO.php";

$mysqli = new mysqli($host, $user, $password, $database);

. . .

if ( $result->num_rows > 0 ) {

$ligne = $result->fetch_object();

$this->nom = $ligne->nom;

$this->adresse = $ligne->adresse;

}

return $result->num_rows ;

} ?>

<?php

$host = "localhost";

$user = "uml";

$password = "uml";

$database = "Produits”;

?>

On isole dans la classe CompteClient tout l’accès aux comptes

clients

(17)

PHP : Panier

•  Mécanisme de sessions et les paniers

–  Base pour la ges2on de panier dans les sites de e-commerce –  Les produits choisis par le client sont enregistrés en tant que

variables de session

–  On peut y garder des objets SIMPLES

Manuele Kirsch Pinheiro - UP1 / CRI / UFR06 Ges2on 17

class LigneProduit {

public $nom ; public $qte ;

/* constructeur */

func1on __construct( $nom ) { $this->nom = $nom;

$this->qte = 1;

} }

Contenu du panier est gardé dans les variables de session.

Tableau contenant des objets LigneProduit.

Chaque $_SESSION[$produit]

con2ent un objet.

(18)

PHP : Panier

Manuele Kirsch Pinheiro - UP1 / CRI / UFR06 Ges2on 18

func1on ajouterProduit($produit) { $qte = 0;

if ( ! isset ( $_SESSION[$produit] ) ) {

$_SESSION[$produit] = new LigneProduit($produit);

$qte = $_SESSION[$produit]->qte }

else { // produit déjà là, augmenter alors sa quan2té $objet = $_SESSION[$produit] ;

$objet->qte = $objet->qte + 1;

$qte = $objet->qte ; }

return $qte;

}

Chaque produit choisi est iden2fié par un « id » (ici le nom).

$_SESSION[$produit]

va contenir un objet LigneProduit

S’il n’y a aucun

$_SESSION[$produit] , on va créer un nouveau objet

LigneProduit

S’il y a déjà un

$_SESSION[$produit] ,

on va juste augmenter la valeur de l’a@ribut « qte » dans l’objet

LigneProduit

(19)

PHP : Panier

Manuele Kirsch Pinheiro - UP1 / CRI / UFR06 Ges2on 19

func1on supprimerProduit($produit) { $qte = 0 ;

if ( isset( $_SESSION[$produit] ) ) { $objet = $_SESSION[$produit] ; $objet->qte = $objet->qte - 1;

$qte = $objet->qte;

if ( $qte <= 0) { //on supprime le produit unset($_SESSION[$produit]);

} }

return $qte;

}

Lorsqu’on veut supprimer un produit, on va réduire sa quan2té

dans l’objet LigneProduit On récupère l’objet LigneProduit gardé dans

$_SESSION[$produit]

On réduit sa quan2té d’une unité

S’il n’en reste plus (la quan1té a a@eint 0 unités), on supprime le

produit de la session

(20)

PHP : Panier

Manuele Kirsch Pinheiro - UP1 / CRI / UFR06 Ges2on 20

func1on afficherPanier() { echo "<table>" ;

foreach($_SESSION as $objet) {

echo "<tr><td> " . $objet->nom . " </td> <td> "

. $objet->qte . " </td> </tr> ";

}

echo "</table>" ; }

On peut récupérer le contenu du panier en récupérant le contenu

de la variable de session

$_SESSION

Pour chaque objet LigneProduit gardé dans

$_SESSION

(21)

PHP : Panier

Manuele Kirsch Pinheiro - UP1 / CRI / UFR06 Ges2on 21

(22)

PHP : Panier avancé

•  Voici un exemple avancé de Panier qui u2lise les classes en PHP et la no2on de session

•  Le panier est modélisé par une classe Panier

Manuele Kirsch Pinheiro - UP1 / CRI / UFR06 Ges2on 22

+ ajouterProduit (code, nom, prix) + supprimerProduit (code)

+ calculerTotal () : float + getNbProduits () : int + nbProduits : int

Panier

+ code : String + nom : String + prix : float

Produit

+ qte : int LignePanier

lignes

*

<?php

class Produit { public $code ; public $nom ; public $prix ; . . .

} ?>

<?php

class LignePanier { public $prod ; public $qte ; . . .

} ?>

(23)

PHP : Panier avancé

Manuele Kirsch Pinheiro - UP1 / CRI / UFR06 Ges2on 23

class Panier { public $lignes ;

public $nbProduits ; func2on __construct() { $this->nbProduits = 0 ; }

Chaque Ligne de Panier est gardée dans un tableau associa2f

$this->lignes[$code] => $LignePanier On commence avec zéro produits

dans le panier

func1on ajouterProduit($code, $nom, $prix) { if ( $this->nbProduits == 0) {

$prod = new Produit($code, $nom, $prix);

$lp = new LignePanier($prod);

$this->lignes[$code] = $lp;

$this->nbProduits = 1;

} . . .

On va créer le tableau lors de l’ajout du premier produit au

panier

(24)

PHP : Panier avancé

Manuele Kirsch Pinheiro - UP1 / CRI / UFR06 Ges2on 24

func1on ajouterProduit($code, $nom, $prix) { if ( $this->nbProduits == 0) { . . . }

else {

if ( isset ( $this->lignes[$code] ) ) { $lp = $this->lignes[$code] ; $qte = $lp->qte;

$lp->qte = $qte + 1;

}

else {

$prod = new Produit($code, $nom, $prix);

$lp = new LignePanier($prod);

$this->lignes[$code] = $lp;

$this->nbProduits = $this->nbProduits + 1;

} }

Pour ajouter, on vérifie si le produit est déjà dans le panier

S’il y est, on le récupère et on met à jours la quan1té

S’il n’y est pas, on va y ajouter une nouvelle ligne de panier

(25)

PHP : Panier avancé

Manuele Kirsch Pinheiro - UP1 / CRI / UFR06 Ges2on 25

func1on ajouterProduit($code, $nom, $prix) { if ( isset ( $this->lignes[$code] ) ) {

$lp = $this->lignes[$code] ; $lp->qte = $lp->qte - 1 ; if ( $lp->qte < 1) {

unset($this->lignes[$code]);

$this->nbProduits = $this->nbProduits - 1;

} } }

On ne supprime que si le produit est dans le panier

S’il y est, on met à jour la quan2té, en supprimant 1 unité

Par contre, s’il ne reste plus rien (qte < 1), on supprime la ligne

de panier du tableau

(26)

PHP : Panier avancé

•  C’est un objet Panier que notre site va manipuler

•  Une page « ctlPanier.php » va ainsi gérer le panier

•  Pour cela, elle va devoir garder un objet Panier dans

$_SESSION

Manuele Kirsch Pinheiro - UP1 / CRI / UFR06 Ges2on 26

+ ajouterProduit (code, nom, prix) + supprimerProduit (code)

+ calculerTotal () : float + getNbProduits () : int + nbProduits : int

Panier

+ ajouterProduit (code, nom, prix) : int + supprimerProduit (code) : int

+ afficherPanier () + terminerSession () + $_SESSION

ctlPanier

<?php

session_start();

include "Panier.php";

. . . ?>

<html> . . . </html>

(27)

PHP : Panier avancé

•  Or un objet Panier est un objet complexe

•  Pour le garder dans $_SESSION, il va falloir le

« compacter » : c’est la sérialisa1on

–  $_SESSION["panier"] = serialize($panier) –  unserialize ( $_SESSION["panier"] )

Manuele Kirsch Pinheiro - UP1 / CRI / UFR06 Ges2on 27

func1on ajouterProduit($produit, $nom, $prix) { . . .

$panier = unserialize($_SESSION["panier"]);

$panier->ajouterProduit($produit, $nom, $prix);

$_SESSION["panier"] = serialize($panier);

. . . func1on supprimerProduit($produit) {

. . .

$panier = unserialize($_SESSION["panier"]);

$panier->supprimerProduit($produit);

$_SESSION["panier"] = serialize($panier);

. . .

Pour ajouter ou supprimer un produit au panier, on va le récupérer, le modifier puis le

remepre dans la session

Références

Documents relatifs

Votre très cher collègue vient de protéger contre toute modification l’interface web du robot que vous venez de recevoir et dont vous venez juste de finir la programmation. Une

Ce que je vous propose, c’est que la prochaine fois que vous vous connecter à un service que vous utilisez déjà, avec peut-être un mot de passe que vous utilisez partout, vous

En cas de perte de votre mot de passe, cliquez sur le lien « RETROUVER MON MOT-DE-PASSE » sur la page de connexion, puis choisissez votre statut dans la liste et entrez votre email

3 En cas de perte de votre mot de passe, cliquez sur le lien « J’ai oublié mon mot de passe » sur la page de connexion, et suivez la procédure indiquée.. En cas de

Les ordinateurs compatibles sont ceux des salles 08, 11, 12, 32, 41, 44, Cedoc ainsi que les PC de l’administration (les PC en libre accès dans les classes et la salle polyvalente

Avec cette attaque, en supposant que notre Bob possède un excellent dictionnaire et que le mot de passe ne soit composé que de mots communs (avec des chiffres ou pas), même s'il

- Exploiter la carte géologique au millionième dans le secteur du Mont Viso et dans la région des Alpes Franco-Italiennes afin d’identifier des marqueurs d’une suture

L’insémination artificielle chez les Ovins est largement répandue dans certains pays possédant de très grands troupeaux. Cependant, les résultats publiés sont