You are on page 1of 16

Birane SECK Cration dun forum en Php et Mysql

Cahier des charges :

Nous allons mettre en place un espace membre assez classique savoir un systme que lon retrouve sur la majorit des sites Internet. Voici les diffrentes tapes que nous allons dtailler et mettre en place ensemble : 1. Formulaire dinscription 2. Activation par e-mail du compte utilisateur 3. Connexion / Dconnexion Au niveau de la gestion des cookies, nous y stockerons lid et le nom de lutilisateur dans des cookies que nous nommerons "ID_UTILISATEUR" et "NOM_UTILISATEUR".

Base de donnes :

Nous travaillerons sur une base de donnes MySQL que nous allons structurer laide de loutil dadministration phpmyadmin, livr avec EasyPHP et la quasi-totalit des hbergements PHP/MySQL.

A lire : MySQL et phpMyAdmin - Premiers pas pour grand dbutant :)

La premire tape consiste crer une table que nous nommerons "Comptes_Utilisateurs" laquelle nous allons ajouter les champs suivants : 1. 2. 3. 4. 5. 6. 7. ID_Utilisateur, clef primaire auto incrmente de type int Nom_Utilisateur de type varchar reprsentant le nom dutilisateur du visiteur Mot_de_Passe de type varchar reprsentant le mot de passe de lutilisateur Adresse_Email de type varchar reprsentant ladresse e-mail du visiteur Date_Inscription de type int reprsentant le timestamp de la date dinscription Compte_Active de type enum nous informera si le compte est actif ou non Clef_Activation de type varchar reprsentera la clef permettant dactiver le compte utilisateur

Remarquez aussi le fait que certaines valeurs par dfaut ont t dfinies. Par exemple, la valeur par dfaut de Compte_Active est dfinie 0. Ce qui veut dire que le compte utilisateur sera par dfaut inactiv.

La page d'accueil :

Crons ds maintenant une page index.php o nous souhaiterons la bienvenue notre visiteur et sur laquelle nous lui proposerons de crer un compte utilisateur, de se connecter ou de se dconnecter sil est dj identifi. Pour le moment, contentons nous duniquement proposer le lien permettant de crer un compte utilisateur, nous la complterons une fois le module mis en place : <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html lang="fr" xml:lang="fr" xmlns="http://www.w3.org/1999/xhtml"> <head> <title>[PHP] Crer un espace membre</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body> <p> <a href="creer-compte-utilisateur.php">Crer un compte utilisateur</a> </p> </body> </html>

Le formulaire d'inscription :

Nous voici la premire grande tape de notre module : le formulaire dinscription. Celui-ci doit se vouloir simple. Il est trs nervant de passer plus dune minute complter un formulaire nous demandant de raconter notre vie intime pour uniquement se crer un accs au site. Ainsi, seules les informations obligatoires telles que le nom dutilisateur, le mot de passe et ladresse e-mail doivent tre demandes. Et encore, nous pouvons trs bien imaginer ne pas

demander de mot de passe notre visiteur et lui en gnrer un directement quil pourra ensuite modifier vie son profil, ce qui ne sera malgr tout pas le cas dans ce tutorial. Voici donc quoi doit ressembler notre formulaire dinscription : <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html lang="fr" xml:lang="fr" xmlns="http://www.w3.org/1999/xhtml"> <head> <title>[PHP] Crer un espace membre</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body> <form action="http://<?= $_SERVER["SERVER_NAME"] . $_SERVER["SCRIPT_NAME" ]; ?>" method="post"> <p> Nom d'utilisateur : <input type="text" name="TB_Nom_Utilisateur" /> </p> <p> Mot de passe : <input type="password" name="TB_Mot_de_Passe" /> </p> <p> Confirmation du mot de passe : <input type="password" name="TB_Confirmation_Mo t_de_Passe" /> </p> <p> Adresse e-mail : <input type="text" name="TB_Adresse_Email" /> </p> <p> <input type="submit" name="BT_Envoyer" value="Envoyer" /> </p> </form> </body> </html> Il faut bien sur veiller ce que lutilisateur ne soit pas identifi lorsquil arrive sur le formulaire dinscription. Sil est identifi, il na donc pas besoin de sinscrire. Le formulaire ne doit donc pas lui tre accessible. <? if(isset($_COOKIE["ID_UTILISATEUR"])) { header("Location: index.php"); } ?> Cration du compte utilisateur :

Voyons maintenant ce quil doit se passer une fois le formulaire dinscription soumit : 1. Vrifier que lutilisateur na pas saisi nimporte quoi 2. Vrifier que le nom dutilisateur ou ladresse e-mail ne sont pas dj utiliss par un autre utilisateur 3. Gnrer une clef dactivation 4. Crer le compte utilisateur dans la base de donnes 5. Envoyer le mail dactivation avec rappel du nom dutilisateur, mot de passe et lien permettant dactiver le compte utilisateur 6. Masquer le formulaire d'inscription Essayons maintenant de traduire tout cela en code PHP : <? // Redirige l'utilisateur s'il est dj identifi if(isset($_COOKIE["ID_UTILISATEUR"])) { header("Location: index.php"); } else { // Formulaire visible par dfaut $masquer_formulaire = false; // Une fois le formulaire envoy if(isset($_POST["BT_Envoyer"])) { // Vrification de la validit des champs if(!ereg("^[A-Za-z0-9_]{4,20}$", $_POST["TB_Nom_Utilisateur"])) { $message = "Votre nom d'utilisateur doit comporter entre 4 et 20 caractres<br />\n" ; $message .= "L'utilisation de l'underscore est autorise"; } elseif(!ereg("^[A-Za-z0-9]{4,}$", $_POST["TB_Mot_de_Passe"])) { $message = "Votre mot de passe doit comporter au moins 4 caractres"; } elseif($_POST["TB_Mot_de_Passe"] != $_POST["TB_Confirmation_Mot_de_Passe"]) { $message = "Votre mot de passe n'a pas t correctement confirm"; } elseif(!ereg("^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]{2,}[.][a-zA-Z]{2,4}$", $_POST["TB_Adresse_Email"])) {

$message = "Votre adresse e-mail n'est pas valide"; } else { // Connexion la base de donnes // Valeurs modifier selon vos paramtres configuration mysql_connect("localhost", "root", ""); mysql_select_db("asp-php"); // Vrification de l'unicit du nom d'utilisateur et de l'adresse e-mail $result = mysql_query(" SELECT Nom_Utilisateur , Adresse_Email FROM Comptes_Utilisateurs WHERE Nom_Utilisateur = '" . $_POST["TB_Nom_Utilisateur"] . "' OR Adresse_Email = '" . $_POST["TB_Adresse_Email"] . "' "); // Si une erreur survient if(!$result) { $message = "Une erreur est survenue lors de la cration de votre compte utilisate ur"; } else { // Si un enregistrement est trouv if(mysql_num_rows($result) > 0) { while($row = mysql_fetch_array($result)) { if($_POST["TB_Nom_Utilisateur"] == $row["Nom_Utilisateur"]) { $message = "Le nom d'utilisateur " . $_POST["TB_Nom_Utilisateur"]; $message .= "est dj utilis"; } elseif($_POST["TB_Adresse_Email"] == $row["Adresse_Email"]) { $message = "L'adresse e-mail " . $_POST["TB_Adresse_Email"]; $message .= "est dj utilise"; } } } else

{ // Gnration de la clef d'activation $caracteres = array("a", "b", "c", "d", "e", "f", 0, 1, 2, 3, 4, 5, 6, 7, 8, 9); $caracteres_aleatoires = array_rand($caracteres, 8); $clef_activation = ""; foreach($caracteres_aleatoires as $i) { $clef_activation .= $caracteres[$i]; } // Cration du compte utilisateur $result = mysql_query(" INSERT INTO Comptes_Utilisateurs( Nom_Utilisateur , Mot_de_Passe , Adresse_Email , Date_Inscription , Clef_Activation ) VALUES( '" . $_POST["TB_Nom_Utilisateur"] . "' , '" . md5($_POST["TB_Mot_de_Passe"]) . "' , '" . $_POST["TB_Adresse_Email"] . "' , '" . time() . "' , '" . $clef_activation . "' ) "); // Si une erreur survient if(!$result) { $message = "Une erreur est survenue lors de la cration de votre compte uti lisateur"; } else { // Envoi du mail d'activation $sujet = "Activation de votre compte utilisateur"; $message = "Pour valider votre inscription, merci de cliquer sur le lien suiv ant :\n"; $message .= "http://" . $_SERVER["SERVER_NAME"]; $message .= "/activer-compte-utilisateur.php?id=" . mysql_insert_id(); $message .= "&clef=" . $clef_activation; // Si une erreur survient if(!@mail($_POST["TB_Adresse_Email"], $sujet, $message))

{ $message = "Une erreur est survenue lors de l'envoi du mail d'activation <br />\n"; $message .= "Veuillez contacter l'administrateur afin d'activer votre co mpte"; } else { // Message de confirmation $message = "Votre compte utilisateur a correctement t crer<br />\n"; $message .= "Un email vient de vous tre envoyer afin de l'activer"; // On masque le formulaire $masquer_formulaire = true; } } } } } // Fermeture de la connexion la base de donnes mysql_close(); } } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html lang="fr" xml:lang="fr" xmlns="http://www.w3.org/1999/xhtml"> <head> <title>[PHP] Crer un espace membre</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body> <? if(isset($message)) { ?> <p><?= $message; ?></p> <? } if($masquer_formulaire != true) { ?> <form action="http://<?= $_SERVER["SERVER_NAME"] . $_SERVER["SCRIPT_NAME" ]; ?>" method="post"> <p> Nom d'utilisateur : <input type="text" name="TB_Nom_Utilisateur" />

</p> <p> Mot de passe : <input type="password" name="TB_Mot_de_Passe" /> </p> <p> Confirmation du mot de passe : <input type="password" name="TB_Confirmation_Mo t_de_Passe" /> </p> <p> Adresse e-mail : <input type="text" name="TB_Adresse_Email" /> </p> <p> <input type="submit" name="BT_Envoyer" value="Envoyer" /> </p> </form> <? } ?> </body> </html> Vrifions que le compte utilisateur a bien t cre dans notre base de donnes :

Vrifions que le mail dactivation est bien arriv destination :

Activation du compte utilisateur :

Maintenant que le compte utilisateur est crer dans la base de donnes, notre visiteur aimerais bien pouvoir se connecter avec sur votre site. Cependant, le compte est dsactiv par dfaut (Compte_Active = 0). Il faut donc maintenant crire le code de la page activer-compteutilisateur.php permettant dactiver le dit compte utilisateur. Une fois que le visiteur va cliquer sur le lien figurant dans le mail dactivation, il nous faut : 1. Vrifier quun identifiant et un numro dactivation dont bien passs en paramtres 2. Vrifier que ces deux paramtres correspondent bien au mme compte utilisateur 3. Activer le compte aprs avoir vrifi quil ntait pas dj actif Une fois ce raisonnement fait, traduisons le en code PHP : <? // Redirige l'utilisateur s'il est dj identifi if(isset($_COOKIE["ID_UTILISATEUR"])) { header("Location: index.php");

} else { // Vrifie que de bonnes valeurs sont passes en paramtres if(!ereg("^[0-9]+$", $_GET["id"]) || !ereg("^[a-f0-9]{8}$", strtolower($_GET["clef"]))) { header("Location: index.php"); } else { // Connexion la base de donnes // Valeurs modifier selon vos paramtres configuration mysql_connect("localhost", "root", ""); mysql_select_db("asp-php"); // Slection de l'utilisateur concern $result = mysql_query(" SELECT ID_Utilisateur , Compte_Active , Clef_Activation FROM Comptes_Utilisateurs WHERE ID_Utilisateur = '" . $_GET["id"] . "' AND Clef_Activation = '" . strtolower($_GET["clef"]) . "' "); // Si une erreur survient if(!$result) { $message = "Une erreur est survenue lors de l'activation de votre compte utilisateur" ; } else { // Si aucun enregistrement n'est trouv if(mysql_num_rows($result) == 0) { header("Location: index.php"); } else { // Rcupration du tableau de donnes retourn $row = mysql_fetch_array($result); // Vrification que le compte ne soit pas dj activ if($row["Compte_Active"] != 0) {

$message = "Votre compte utilisateur a dj t activ"; } else { // Activation du compte utilisateur $result = mysql_query(" UPDATE Comptes_Utilisateurs SET Compte_Active = '1' WHERE ID_Utilisateur = '" . $_GET["id"] . "' AND Clef_Activation = '" . strtolower($_GET["clef"]) . "' "); // Si une erreur survient if(!$result) { $message = "Une erreur est survenue lors de l'activation de votre compte ut ilisateur"; } else { $message = "Votre compte utilisateur a correctement t activ"; } } } } // Fermeture de la connexion la base de donnes mysql_close(); } } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html lang="fr" xml:lang="fr" xmlns="http://www.w3.org/1999/xhtml"> <head> <title>[PHP] Crer un espace membre</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body> <p><?= $message; ?></p> </body> </html>

Connexion / Dconnexion :

Nous arrivons la dernire grande tape de notre module. Permettre lutilisateur douvrir et de fermer sa session. Nous avions laiss la page index.php temporairement en plan, terminons l en affichant diffrents liens selon le fait que lutilisateur soit identifi ou non : <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html lang="fr" xml:lang="fr" xmlns="http://www.w3.org/1999/xhtml"> <head> <title>[PHP] Crer un espace membre</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body> <? if(isset($_COOKIE["ID_UTILISATEUR"])) { ?> <p> <a href="deconnexion.php">Dconnexion</a> </p> <? } else { ?> <p> <a href="creer-compte-utilisateur.php">Crer un compte utilisateur</a> | <a href="connexion.php">Connexion</a> </p> <? } ?> </body> </html> Occupons nous maintenant de la page connexion.php. Celle-ci devra proposer un formulaire permettant de saisir notre nom dutilisateur et notre mot de passe donc typiquement : <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html lang="fr" xml:lang="fr" xmlns="http://www.w3.org/1999/xhtml"> <head> <title>[PHP] Crer un espace membre</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body> <form action="http://<?= $_SERVER["SERVER_NAME"] . $_SERVER["SCRIPT_NAME "]; ?>" method="post"> <p> Nom d'utilisateur : <input type="text" name="TB_Nom_Utilisateur" /> </p> <p>

Mot de passe : <input type="password" name="TB_Mot_de_Passe" /> </p> <p> <input type="checkbox" name="CB_Connexion_Automatique" /> Se connecter automatiquement chaque visite </p> <p> <input type="submit" name="BT_Envoyer" value="Envoyer" /> </p> </form> </body> </html> Il est devenu galement assez courant de demander ladresse e-mail plutt que le nom dutilisateur. Ce nest pas ce que nous ferons dans notre exemple mais sachez que le principe reste exactement le mme, il suffit juste de modifier le nom des champs dans le code PHP vrifiant le tout une fois le formulaire soumit. Justement, nous y arrivons. Que doit-il se passer une fois le formulaire envoy ? 1. 2. 3. 4. 5. Vrifier que lutilisateur na pas saisi nimporte quoi Vrifier que le compte utilisateur existe bien dans la base de donnes Si le compte existe, vrifier quil est bien actif Vrifier que le mot de passe est correct Voir si lutilisateur a demand rester identifi et crer les cookies en consquence

Compris ? Aller, traduction en version PHP : <? // Redirige l'utilisateur s'il est dj identifi if(isset($_COOKIE["ID_UTILISATEUR"])) { header("Location: index.php"); } else { // Formulaire visible par dfaut $masquer_formulaire = false; // Une fois le formulaire envoy if(isset($_POST["BT_Envoyer"])) { // Vrification de la validit des champs if(!ereg("^[A-Za-z0-9_]{2,20}$", $_POST["TB_Nom_Utilisateur"])) { $message = "Votre nom d'utilisateur doit comporter entre 2 et 20 caractres<br />\n

"; $message .= "L'utilisation de l'underscore est autorise"; } elseif(!ereg("^[A-Za-z0-9]{6,}$", $_POST["TB_Mot_de_Passe"])) { $message = "Votre mot de passe doit comporter au moins 6 caractres"; } else { // Connexion la base de donnes // Valeurs modifier selon vos paramtres configuration mysql_connect("localhost", "root", ""); mysql_select_db("asp-php"); // Slection de l'utilisateur concern $result = mysql_query(" SELECT ID_Utilisateur, Nom_Utilisateur, Mot_de_Passe, Compte_Active FROM Comptes_Utilisateurs WHERE Nom_Utilisateur = '" . $_POST["TB_Nom_Utilisateur"] . "' "); // Si une erreur survient if(!$result) { $message = "Une erreur est survenue lors de la tentative de connexion"; } else { // Si aucun utilisateur n'a t trouv if(mysql_num_rows($result) == 0) { $message = "Le nom d'utilisateur " . $_POST["TB_Nom_Utilisateur"] . " n'e xiste pas"; } else { // Rcupration des donnes $row = mysql_fetch_array($result); // Si le compte n'a pas t activ if($row["Compte_Active"] == 0) { $message = "Votre compte utilisateur n'a pas t activ"; } else {

// Vrification du mot de passe if(md5($_POST["TB_Mot_de_Passe"]) != $row["Mot_de_Passe"]) { $message = "Votre mot de passe est incorrect"; } else { // Dfinition du temps d'expiration des cookies $expiration = empty($_POST["CB_Connexion_Automatique"]) ? 0 : time() + 90 * 24 * 60 * 60; // Cration des cookies setcookie("ID_UTILISATEUR", $row["ID_Utilisateur"], $expiration, "/"); setcookie("NOM_UTILISATEUR", $row["Nom_Utilisateur"], $expira tion, "/"); // Fermeture de la connexion la base de donnes mysql_close(); // Redirection de l'utilisateur header("Location: index.php"); } } } } // Fermeture de la connexion la base de donnes mysql_close(); } } } ?> <html> <head> <title>[PHP] Crer un espace membre</title> </head> <body> <? if(isset($message)) { ?>

<p><?= $message; ?></p> <? } if($masquer_formulaire != true) { ?> <form action="http://<?= $_SERVER["SERVER_NAME"] . $_SERVER["SCRIPT_NAME "]; ?>" method="post"> <p> Nom d'utilisateur : <input type="text" name="TB_Nom_Utilisateur" /> </p> <p> Mot de passe : <input type="password" name="TB_Mot_de_Passe" /> </p> <p> <input type="checkbox" name="CB_Connexion_Automatique" /> Se connecter automatiquement chaque visite </p> <p> <input type="submit" name="BT_Envoyer" value="Envoyer" /> </p> </form> <? } ?> </body> </html> Plus rapide maintenant, la page deconnexion.php qui consiste en gros, vous laurez compris, dtruire les cookies cres par la page connexion.php. <? // Redirige l'utilisateur s'il n'est pas identifi if(empty($_COOKIE["ID_UTILISATEUR"])) { header("Location: index.php"); } else { // Suppression des cookies setcookie("ID_UTILISATEUR", "", time() - 1, "/"); setcookie("NOM_UTILISATEUR", "", time() - 1, "/"); // Redirection de l'utilisateur header("Location: index.php"); } ?> Ouvrons notre session :

Si vous avez coch la checkbox pour rester connect. Fermer votre navigateur et revenez sur votre site pour voir si vous tes toujours identifi. Fermons maintenant notre session :

Nous constatons, en voyant les diffrents messages de bienvenue sur la page daccueil, que les cookies se crent et se dtruisent au fur et mesure des actions que nous effectuons. Tout se passe donc comme nous lavions crit. Inutile en revanche de prciser que votre navigateur doit accepter lutilisation des cookies.

Good job!

Voici globalement ce quil y a savoir sur la mise en place dun espace membre. Ce tutorial se veut uniquement titre dexemple. En effet, vous maintenant de lintgrer votre site en y apportant les modifications que vous souhaiter. Ne serait-ce quau niveau de la prsentation mais galement au niveau des informations que vous voulez stocker. Le principe, encore une fois, reste exactement le mme. Jespre que toutes les questions que nous aurons trouves sur le forum ce sujet auront trouv leurs rponses travers ce tutorial. Bon dveloppement !

Seck_bira@hotmail.com

You might also like