20.Exemples de scripts PHP

20.3.Section membre

20.3.4.Accès à une section membre

20.3.4.1.Analyse

Nous allons cette fois généraliser le principe précédent à une section (série de pages) du site (et non plus seulement à une page affichant les données de l'utilisateur). Nous supposerons dans un premier temps qu'il suffit à l'utilisateur de s'inscrire pour avoir le droit d'accéder à cette section (sans qu'il y ait eu au préalable une quelconque autorisation de la part de l'administrateur du site).
Pour n'autoriser l'accès à une section qu'aux utilisateurs enregistrés, il faut pour chaque page de cette section vérifier que l'utilisateur a bien le droit de se connecter.
Typiquement cela peut consister, pour chacune de ces pages, à vérifier la présence dans la base d'un utilisateur ayant l'identifiant et le mot de passe saisi dans le formulaire d'identification pour savoir si oui ou non la page doit être affichée.
Faire un contrôle sur toutes les pages (et non seulement la page d'accueil) s'impose puisque n'importe quelle page de la section membre pourrait être accédée directement en tapant son URL dans la barre du navigateur. Dans ce cas, la principale difficulté consisterait à conserver (lors du passage d'une page à l'autre) les informations saisies via le formulaire. Est-ce pertinent de faire systématiquement appel à la base de données ?
Pour conserver l'information id et motDePasse vous pouvez faire appel aux variables de session. Vous serez alors (quasiment) assuré de pouvoir y faire appel depuis n'importe quelle page du site.
A partir du moment, où vous utiliser les variables de sessions pourquoi ne pas tout simplement utiliser une variable pour préciser si oui ou non l'utilisateur est un utilisateur enregistré plutôt que de faire appel systématiquement à la base de données.
Conclusion: Pour faire une section membre, il suffit de vérifier dans la base de données les paramètres saisis dans le formulaire puis de stocker l'information dans une variable de session. Cette variable sera alors vérifiée sur chaque page de la section membre.

C'est ce que nous allons mettre en place dans le chapitre suivant.

20.3.4.2.Implémentation

Le formulaire d'identification ne change pas fondamentalement. Nous avons simplement changé le nom du script appelé.
<html>
<body>
    <form action="sectionmembre_acces.php" method="post">
        Identifiant: <input type="text" name="id" maxlength="32"/>
        <br/>
        Mot de passe: <input type="password" name="motdepasse" maxlength="16"/>
        <br />
        <input type="submit" value="Se connecter"/>
    </form>
</body>
</html>

Le script de vérification des paramètres de connexion se contente donc de positionner une variable de session et de rediriger vers une page ou une autre selon la validité du mot de passe.
<?php
    // Script faisant appel aux sessions
    session_start();

    // Paramètres de connexion à la base de données
    $BD_serveur     = "localhost";
    $BD_utilisateur = "root";
    $BD_motDePasse  = "";
    $BD_base        = "mabase";

    $id         = $_POST["id"];
    $motDePasse = $_POST["motdepasse"];

    @mysql_pconnect($BD_serveur, $BD_utilisateur, $BD_motDePasse)
        or die("Impossible de se connecter au serveur de bases de données.");
    @mysql_select_db($BD_base)
        or die("Impossible de se connecter à la base de données.");
 
    $requete = "SELECT * FROM table_utilisateurs ".
                       " WHERE id='$id' AND motdepasse='$motDePasse'";
                       
    $result = @mysql_query($requete);
    
    if ($enreg = @mysql_fetch_array($result)) {
        // Si une ligne a été trouvée c'est que le couple
        // (identifant, mot de passe) est valide
        $_SESSION["membre"] = TRUE;
        $_SESSION["membreid"] = $id;
        header("Location: sectionmembre_acces_accueil.php");
        die();
    } else {
        $_SESSION["membre"] = FALSE;
        header("Location: sectionmembre_acces_invalide.html");
        die();
    }
?>
En cas de succès, une page d'accueil est affichée à condition toutefois que la variable de session soit à TRUE (sachant que ce script pourrait aussi très bien être accédé directement).
<?php
    // Page faisant appel aux sessions
    session_start();

    // Vérification de l'autorisation
    if (!$_SESSION["membre"]) {
       // Si l'utilisateur n'est pas autorisé il est reconduit
       // sur le formulaire d'identification
       header("Location: sectionmembre_acces.html");
       die();
    }   
?>    
<html>
<body>
<h1>Bienvenue dans la section membre</h1>
Vous pouvez ici, accéder à vos données.<br />
<a href="sectionmembre_acces_visualise.php">Mes données</a><br />
Ainsi qu'aux informations réservées à nos membres.<br />
<a href="sectionmembre_acces_info.php">Les infos</a><br />
</body>
</html>
En cas d'erreur, c'est un petit message avec un lien de renvoi qui est affiché.
<html>
  <head>
    <meta charset="utf-8">
  </head>
  <body>
      Désolé, les paramètres de connexions ne sont pas valides.<br />
      Essayer à nouveau en cliquant
      <a href="sectionmembre_acces.html">Ici</a>
  </body>
</html>    
Depuis la page d'accueil de la section membre, l'utilisateur à la possibilité d'accéder à ses données. Comme nous avions pris soin de mémoriser l'identifiant de l'utilisateur lors de sa connexion, le script devient:
<?php
    // Page faisant appel aux sessions
    session_start();

    // Vérification de l'autorisation
    if (!$_SESSION["membre"]) {
        // Si l'utilisateur n'est pas autorisé il est reconduit
        // sur le formulaire d'identification
        header("Location: sectionmembre_acces.html");
        die();
    }  

    // Paramètres de connexion à la base de données
    $BD_serveur     = "localhost";
    $BD_utilisateur = "root";
    $BD_motDePasse  = "";
    $BD_base        = "mabase";

    @mysql_pconnect($BD_serveur, $BD_utilisateur, $BD_motDePasse)
        or die("Impossible de se connecter au serveur de bases de données.");
    @mysql_select_db($BD_base)
        or die("Impossible de se connecter à la base de données.");
 
    $requete = "SELECT * FROM table_utilisateurs ".
                       " WHERE id='".$_SESSION["membreid"]."'";
                       
    $result = mysql_query($requete);
    
    if ($enreg = mysql_fetch_array($result)) {
        // Si une ligne a été trouvée c'est que le couple
        // (identifant, mot de passe) est valide
        echo "NOM : " . $enreg["nom"] . "<br/>";
        echo "PRENOM : " . $enreg["prenom"] . "<br/>";
        echo "ADRESSE : " . $enreg["adresse"] . "<br/>";
    } else {
        echo "Une erreur inattendue est intervenue.<br/>";
    }
?>
Le membre peut également accéder à n'importe quel script de la section protégée par le test sur la valeur de $_SESSION["membre"].
<?php
    // Page faisant appel aux sessions
    session_start();

    // Vérification de l'autorisation
    if (!$_SESSION["membre"]) {
        // Si l'utilisateur n'est pas autorisé il est reconduit
        // sur le formulaire d'identification
        header("Location: sectionmembre_acces.html");
        die();
    }  
?>
<html>
    <body>
    Cher membre,<br/>
    Vous avez le privilège d'accéder à cette information confidentielle.<br />
    <b>On a marché sur la lune !</b>
    </body>
</html>
Plutôt que de dupliquer le test sur chaque script de la section, vous aurez tout intérêt à l'isoler dans un script dédié qui sera alors inclus dans chacun des scripts de la section membre. Plutôt que de positionner $_SESSION["membre"] à TRUE ou FALSE, il est également possible d'indiquer un nombre (ou une chaîne de caractères) précisant un niveau d'autorisation (ex: 0 = non autorisé, 1 = invité, 2 = membre, 4 = administrateur).