Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les tutoriels > Non-Officiels > Site Web > PHP > Systèmes complets > Créer son forum de toutes pièces > Les pages membres > Inscription et connexion > Lecture du tutoriel

Inscription et connexion

Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)
Avatar
Auteur : General Vans
Note : 17 / 20 (20 votes)
Visualisations : 32 322

Plus d'informations Plus d'informations
On arrive à ma partie préférée : la création de la page connexion.php, et register.php. Comme leurs noms l'indiquent bien, elles permettront aux visiteurs soit de se connecter, ou bien, s'il n'est pas inscrit sur le forum, de le faire tout de suite.

Qu'est-ce qu'on attend ? C'est parti ! :soleil:
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Connexion

La page qu'on va créer maintenant s'appelle sobrement connexion.php ; ce qu'on veut qu'elle fasse est simple, présenter un formulaire avec pseudo et mot de passe, puis envoyer les infos sur une page traitement, que j'ai nommée connexionok.php.

Formulaire



Je vous avais prévenus que ce tutoriel touchait pas mal d'aspects différents du php : cette fois, on va passer un moment sur les formulaires.

On commence avec le début de la page, toujours le même :

Page : connexion.php

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<?php
//Cette fonction doit être placé avant le reste
session_start();
 
$titre = "Connexion";
include("includes/debut.php");
?>
 
<div id="banniere"></div>
<div id="corps_forum">
<a href="./index.php">Index du forum</a>


Bon : je ne pense pas avoir besoin de m'arrêter longtemps, c'est la même chose que partout ailleurs. On va maintenant afficher le formulaire, mais avant, un peu de sécurité s'impose :

Code : PHP
1
2
3
4
5
6
7
8
<?php
//Par sécurité, on vérifie que le membre qui accède à cette page n'est pas déjà connecté
if (isset($_SESSION['pseudo']))
{
echo '<p>Désolé, mais vous ne pouvez pas accéder à cette page.</p></div></body></html>';
exit();
}
?>


Voilà, à présent le formulaire (pas besoin de php ici).

Code : HTML
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<h1>Connexion</h1>
<form method="post" action="connexionok.php">
<fieldset>
<legend>Connexion</legend>
<p>
<label for="pseudo">Pseudo :</label><input name="pseudo" type="text" id="pseudo" /><br />
<label for="password">Mot de Passe :</label><input type="password" name="password" id="password" /><br />
</p>
</fieldset>
<p><input type="submit" value="Connexion" /></p></form>
<a href="./register.php">Pas encore inscrit ?</a>
 
</div>
</body>
</html>


Voilà, c'est tout pour cette page :) . Si elle est si courte, c'est parce que le traitement va se faire ailleurs ; finalement, on a juste à afficher le formulaire ici.
Voici tout de même quelques explications.
Dans un premier temps, je vérifie que l'utilisateur qui arrive sur cette page n'est pas déjà connecté sous un pseudo, ça ne poserait pas trop de problème à priori, mais il n'est pas censé y être, alors autant le lui faire comprendre. Donc si ce cas se produit, le visiteur aura un petit message d'erreur.

Un autre point, la balise <label for="pseudo"> : pour bien comprendre son intérêt, je vous envoie sur le tuto de Romain128.
Si vous avez la flemme de le lire (ce qui serait dommage, mais bon ... :p ), sachez que cela permet à la fois d'aligner ses champs de texte, et de pouvoir aller directement sur le champ en cliquant sur le nom. Essayez : en cliquant sur pseudo, vous verrez (ça ne marche pas sur IE, apparemment).

Bref, si vous voulez un effet parfait, lancez votre fichier css et ajoutez ceci :

Code : CSS
1
2
3
4
5
label {
display:block;
width:150px;
float:left;
}


Traitement



On passe sans plus attendre à la page connexionok.php : je conviens que ce nom n'est pas terrible, mais je n'ai pas trouvé mieux, en fait :honte: .

Cette page va être une succession de vérifications pour savoir si tout a bien été rempli. J'ai répertorié plusieurs erreurs :

Soit un des champs est vide
Soit le membre est déjà connecté
Soit le mot de passe est incorrect

Selon le cas, une variable $message contiendra un petit texte qu'on affichera ensuite.

Page : connexionok.php

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<?php
session_start();
 
// Message
 
if (empty($_POST['pseudo']) || empty($_POST['password']) ) //Oublie d'un champ
{
        $message = '<p>une erreur s est produite pendant votre identification.
        Vous devez remplir tous les champs
        Cliquez <a href="./connexion.php">ici</a> pour revenir</p>';
}
else
{
        //Acces interdit : le membre est déjà connecté
        if (isset($_SESSION['pseudo'])) 
        {
                $message ='<p>Désolé mais vous ne pouvez 
                pas accéder à cette page</p>';
        }
        else // Autorisation ok : il reste à voir le mot de passe
        {
        include("includes/identifiants.php");
        mysql_connect($adresse, $nom, $motdepasse);
        mysql_select_db($database);
       
       
        //On protège les données
        $pseudo = mysql_real_escape_string($_POST['pseudo']);
        $password = mysql_real_escape_string($_POST['password']);
        
        $requete1 = mysql_query('SELECT membre_mdp, membre_id, membre_rang 
        FROM forum_membres WHERE membre_pseudo = "'.$pseudo.'"') 
        or die (mysql_error());
        $data1 = mysql_fetch_assoc($requete1);
 
        
        if ($data1['membre_mdp'] == md5($password)) // Acces OK !
        {
       
                $_SESSION['pseudo'] = $pseudo;
                $_SESSION['level'] = $data1['membre_rang'];
                $_SESSION['id'] = $data1['membre_id'];
       
                $message = '<p>Bienvenue '.stripslashes(htmlspecialchars($_SESSION['pseudo'])).', 
                vous êtes maintenant connecté!</p>
                <p>Cliquez <a href="./index.php">ici</a> 
                pour revenir à la page d accueil</p>';
       
         }
         else // Acces pas OK !
         {
                $message = '<p>Une erreur s est produite 
                pendant votre identification.
                Le mot de passe ou le pseudo entré n est pas correcte.
                Cliquez <a href="./connexion.php">ici</a> 
                pour revenir à la page précédente
                <br /><br />
                Cliquez <a href="./index.php">ici</a> 
                pour revenir à la page d accueil</p>';
          }
          }
}
//Ici seulement on affiche la page
include("includes/debut.php");
?>
<div id="banniere"></div>
 
 
<div id="corps_forum">
<?php
echo $message;
?>
</div>
</body>
</html>


Terminé :) !
Je pense que le code est assez commenté pour être compris, il n'y a de toute façon rien de dur, ce sont juste des if, tout ce qu'il y a de plus classique ^^ .

Ya un truc moyen, lorsqu'on a terminé la connexion on est redirigé vers la page d'accueil, on peut pas revenir à la page précédente ?


Si mais il faut au préalable ajouter un petit quelque chose sur la page connexion.php

En fait il va falloir retenir la page visitée juste avant l'inscription et l'envoyer via un champ hidden à la page connexionok.php.

Page : connexion.php

Code : PHP
1
<input type="hidden" name="page" value="<? echo htmlspecialchars($_SERVER['HTTP_REFERER']); ?>" />


Ainsi il suffira de faire

Page : connexionok.php

Code : PHP
1
2
3
4
<?
$page = $_POST['page'];
echo 'Cliquez <a href="'.$page.'">ici</a> pour revenir à la page précédente';
?>


En résumé



Si on résume ce qu'on vient de faire ici, on a donné la possibilité à n'importe quel visiteur déjà inscrit (on verra plus tard pour les inscriptions) de se connecter. Ainsi, une variable $_SESSION['pseudo'] est créée avec pour valeur... le pseudo du membre ! On a de plus créé d'autres variables de session pour simplifier les codes à venir.
Puisqu'on a utilisé le système de sessions, la variable est détruite à la fin de la visite.

Déconnexion



C'est cool ton truc, mais si j'ai envie de me déconnecter ?


Bah j'y viens justement, on va créer une troisième page (jamais 2 sans 3), appelée deconnexion.php.
Le code est hyper court :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
<?php
session_start();
session_destroy();
 
include("includes/debut.php");
?>
 
<div id="corps_forum">
 
<?php
echo '<p>Vous êtes à présent déconnecté <br />
Cliquez <a href="'.htmlspecialchars($_SERVER['HTTP_REFERER']).'">ici</a> 
pour revenir à la page précédente.</p>';
?>
</div>
</div>
 
</body>
</html>


Voilà, tout ce qu'on fait c'est appeler la fonction session_destroy pour détruire les variables de session.
Pour ne pas se retrouver perdus sur la page, j'ai mis un lien vers la dernière page visitée, c'est à vous de personnaliser le reste comme bon vous semble.

Enregistrement

On arrive à une partie un peu plus difficile, non pas parce qu'elle demande des connaissances particulières, mais parce que le code de ces deux pages va être plus long. Mais pas de panique : ce n'est pas ça qui va nous effrayer, hein ? ^^
Allez : on commence !

register.php



La fameuse page register.php : si vous avez regardé attentivement les anciens codes (et j'espère bien que c'est le cas :D ), vous avez pu voir plusieurs liens qui envoyaient ici, pour l'instant en cliquant dessus, et vous avez dû voir s'afficher une erreur 404 : Page introuvable (normal d'un côté, vu qu'on n'a pas encore commencé).
Comme pour le système de connexion, on va utiliser deux pages : une pour le formulaire, et l'autre pour le traitement des données envoyées. Pour les noms, je n'ai rien trouvé de plus glamour que register.php et registerok.php : on va faire avec pour l'instant :p .

Comme d'habitude, la page de formulaire est vraiment simple et courte, je vais donc mettre tout le code d'un coup.

Page : register.php

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
//Cette fonction doit être appelée avant tout code html
session_start();

//On donne ensuite un titre à la page, puis on appelle notre fichier debut.php
$titre = "Index du forum";
include("includes/debut.php");
?>
<body>
<div id="banniere"></div>
<?php
//Maintenant on se connecte à la base de données
include("includes/identifiants.php");
mysql_connect($adresse, $nom, $motdepasse);
mysql_select_db($database);
?>
<div id="corps_forum">
<a href ="./index.php">Index du forum</a>

<?php
//On évite qu'un membre déjà connecté se retrouve ici !
if (isset($_SESSION['pseudo']))
{
echo '<p>Désolé, mais vous ne pouvez pas accéder à cette page.</p></div></body></html>';
exit();
}
?>


Et le formulaire :

Code : HTML
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<h1>Inscription 1/2</h1>

<form method="post" action="registerok.php" enctype="multipart/form-data">

<fieldset><legend>Identifiants</legend>
<label for="pseudo">* Pseudo :</label>  <input name="pseudo" type="text" id="pseudo" /> (le pseudo doit contenir entre 3 et 15 caractères)<br />
<label for="password">* Mot de Passe :</label><input type="password" name="password" id="password" /><br />
<label for="confirm">* Confirmer le mot de passe :</label><input type="password" name="confirm" id="confirm" />
</fieldset>
<fieldset><legend>Contacts</legend>
<label for="email">* Votre adresse Mail :</label><input type="text" name="email" id="email" /><br />
<label for="msn">Votre adresse MSN :</label><input type="text" name="msn" id="msn" /><br />
<label for="website">Votre site web :</label><input type="text" name="website" id="website" />
</fieldset>
<fieldset><legend>Informations supplémentaires</legend>
<label for="localisation">Localisation :</label><input type="text" name="localisation" id="localisation" />
</fieldset>
<fieldset><legend>Profil sur le forum</legend>
<label for="avatar">Choisissez votre avatar :</label><input type="file" name="avatar" id="avatar" />(Taille max : 10 ko)<br />
<label for="signature">Signature :</label><textarea cols="40" rows="4" name="signature" id="signature">La signature est limitée à 200 caractères</textarea>
</fieldset>
<p>Les champs précédés d un * sont obligatoires</p>
<p><input type="submit" value="S'inscrire" /></p></form>
</h2>
</div>
</body>
</html>


Le début de ce code, vous devez commencer à avoir marre de le voir puisque c'est le même : ensuite, on vérifie qu'un membre connecté n'arrive pas sur la page. Si tout va bien, on lance le formulaire avec plusieurs champs à remplir (le nombre des champs et ce que vous voulez en faire dépend totalement de votre table forum_membres ; si vous voulez par exemple demander l'âge du membre, pensez à créer un champ membre_age avant).

Dis-moi bonhomme, pourquoi tu as rajouté enctype="multipart/form-data" dans ta balise <form> ?

C'est une bonne question... à laquelle je ne vais pas répondre. Non pas par flemme (encore que...), mais parce qu'un tutoriel rédigé par DHKold l'a déjà fait (et sûrement mieux que je ne le ferais). De toute façon, il vous faudra le lire si vous voulez comprendre la suite. Ce tutoriel traite des uploads de fichiers (lien), et on va s'en servir pour les avatars.

Bon. Si vous êtes toujours là, on va pouvoir s'attaquer à la page registerok.php :pirate: !


registerok.php



Exactement comme pour la page connexionok.php, on va réaliser une série de tests pour voir si tout concorde. Si ce n'est pas le cas, on affiche un message d'erreur. Mais contrairement au système de connexion, on n'a plus que trois champs à vérifier.

Allez : comme d'hab', on prend le début classique.

Page : registerok.php

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
//Cette fonction doit être appelée avant tout code html
session_start();

//On donne ensuite un titre à la page, puis on appelle notre fichier debut.php
$titre = "Index du forum";
include("includes/debut.php");
?>
<body>
<div id="banniere"></div>
<?php
//Maintenant, on se connecte à la base de données
include("includes/identifiants.php");
mysql_connect($adresse, $nom, $motdepasse);
mysql_select_db($database);


$pseudo_erreur1 = NULL;
$pseudo_erreur2 = NULL;
$mdp_erreur = NULL;
$email_erreur1 = NULL;
$email_erreur2 = NULL;
$msn_erreur = NULL;
$signature_erreur = NULL;
$avatar_erreur = NULL;
$avatar_erreur1 = NULL;
$avatar_erreur2 = NULL;
$avatar_erreur3 = NULL;


On n'oublie pas de déclarer nos variables au début, chez certains ça n'est pas nécessaire mais chez d'autre ça fait tout planter donc autant le faire.

Pseudo et mot de passe



Pour la suite, on va commencer par vérifier les champs pseudo et mot de passe : ce sont les deux qui demandent le plus de tests.

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php

//On récupère les variables
$i = 0;
$temps = time(); 
$signature = mysql_real_escape_string($_POST['signature'], ENT_QUOTES));
$pseudo = mysql_real_escape_string($_POST['pseudo']);
$email = mysql_real_escape_string($_POST['email']);
$msn = mysql_real_escape_string($_POST['msn']);
$website = mysql_real_escape_string($_POST['website']);
$localisation = mysql_real_escape_string($_POST['localisation']);
$pass = md5($_POST['password']);
$confirm = md5($_POST['confirm']);


//Vérification du pseudo
$nombrepseudo = mysql_result(mysql_query('SELECT COUNT(*) FROM forum_membres WHERE membre_pseudo = "'.$pseudo.'"'), 0);
if($nombrepseudo != 0)
{
        $pseudo_erreur1 = "Votre pseudo est déjà utilisé par un membre";
        $i++;
}
if (strlen($pseudo) < 3 || strlen($pseudo) > 15)
{
        $pseudo_erreur2 = "Votre pseudo est soit trop grand, soit trop petit";
        $i++;
}
//Vérification du mdp
if ($pass != $confirm || empty($confirm) || empty($pass))
{
        $mdp_erreur = "Votre mot de passe et votre confirmation diffèrent, ou sont vides";
        $i++;
}
?>


Voilà, on est arrivés au bout. Je vais détailler ce qui est écrit plus haut.

Pour commencer, j'initialise une variable $i à 0 : son rôle est de stocker le nombre d'erreurs. Pour ce faire, elle est incrémentée à chaque fois qu'un problème est détecté.

Ensuite on passe au pseudo. Il y a plusieurs erreurs possibles : soit le pseudo existe déjà, dans ce cas, on fait une requête qui va nous retourner le nombre d'entrées de la table forum_membres ayant le même pseudo que celui qui a été posté. Pour cela, j'utilise la fonction mysql_result, qui va nous permettre de savoir si le pseudo est déjà utilisé ou non ; ici, si on trouve autre chose que 0, il y a un problème : donc, on incrémente $i.

Par ailleurs, vous avez pu remarquer la présence de la variable $message_pseudo1 : elle va stocker un message, qu'on affichera plus tard pour aider le membre à corriger ses erreurs.

Bref, continuons : la deuxième erreur concerne la taille du pseudo. En général, on aime qu'il contienne entre 3 et 15 caractères (ne me demandez pas pourquoi, par contre ^^ ) : donc j'ai utilisé la fonction strlen qui retourne le nombre de caractères d'un texte. Encore une fois, s'il y a un problème, on incrémente $i, et on crée le message.

On arrive maintenant au mot de passe. Pour lui, on a fait d'une pierre deux coups, puisque j'ai vérifié en même temps s'il était identique à la confirmation, et s'il était vide.

e-mail, MSN et Signature



Sans plus attendre, la suite du code :p :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
//Vérification de l'adresse email

//Il faut que l'adresse email n'ait jamais été utilisée

$nombremail = mysql_result(mysql_query('SELECT COUNT(*) FROM forum_membres WHERE membre_email = "'.$email.'"'), 0);

if ($nombremail != 0)
{
        $email_erreur1 = "Votre adresse email est déjà utilisée par un membre";
        $i++;
}
//On vérifie la forme maintenant
if (!preg_match("#^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]{2,}\.[a-z]{2,4}$#", $email) || empty($email))
{
        $email_erreur2 = "Votre adresse E-Mail n'a pas un format valide";
        $i++;
}
//Vérification de l'adresse MSN
if (!preg_match("#^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]{2,}\.[a-z]{2,4}$#", $msn) && !empty($msn))
{
        $msn_erreur = "Votre adresse MSN n'a pas un format valide";
        $i++;
}
//Vérification de la signature
if (strlen($signature) > 200)
{
        $signature_erreur = "Votre signature est trop longue";
        $i++;
}
?>


On fait des vérifications sur les adresses e-mail et MSN, qui utilisent les regex, afin d'être sûrs que le visiteur n'a pas entré n'importe quoi.
Remarquez que la regex utilisée pour l'adresse MSN peut être différente si on veut être plus précis et certains qu'elle est bien en .hotmail ou .msn...

En revanche pour la signature, on n'a pas ce genre de problème : on vérifie alors juste la longueur avec la fonction strlen ; par ailleurs, comme le champ n'était pas obligatoire, il est inutile de vérifier s'il est vide.


L'avatar



On va s'arrêter un petit moment sur l'avatar, car c'est ce qui demande le plus de vérifications. Vous pouvez facilement comprendre pourquoi on ne peut pas laisser des inconnus envoyer n'importe quoi sur notre serveur. Le tuto que j'ai mentionné plus haut explique ceci en détail.

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php
//Vérification de l'avatar :
if (!empty($_FILES['avatar']['size']))
{
        //On définit les variables :
        $maxsize = 10024; //Poid de l'image
        $maxwidth = 100; //Largeur de l'image
        $maxheight = 100; //Longueur de l'image
        $extensions_valides = array( 'jpg' , 'jpeg' , 'gif' , 'png', 'bmp' ); //Liste des extensions valides
        
        if ($_FILES['avatar']['error'] > 0)
        {
                $avatar_erreur = "Erreur lors du tranfsert de l'avatar : ";
        }
        if ($_FILES['avatar']['size'] > $maxsize)
        {
                $i++;
                $avatar_erreur1 = "Le fichier est trop gros : (<strong>".$_FILES['avatar']['size']." Octets</strong>    contre <strong>".$maxsize." Octets</strong>)";
        }

        $image_sizes = getimagesize($_FILES['avatar']['tmp_name']);
        if ($image_sizes[0] > $maxwidth OR $image_sizes[1] > $maxheight)
        {
                $i++;
                $avatar_erreur2 = "Image trop large ou trop longue : (<strong>".$image_sizes[0]."x".$image_sizes[1]."</strong> contre <strong>".$maxwidth."x".$maxheight."</strong>)";
        }
        
        $extension_upload = strtolower(substr(  strrchr($_FILES['avatar']['name'], '.')  ,1));
        if (!in_array($extension_upload,$extensions_valides) )
        {
                $i++;
                $avatar_erreur3 = "Extension de l'avatar incorrecte";
        }
}
?>


Certaines parties de ce code sont assez compliquées, mais elles sont détaillées dans le tutoriel de DHKold. Sachez simplement qu'on utilise le même système que précédemment, avec la variable i qui s'incrémente à chaque erreur.

Quelques remarques toutefois.
- Les variables $maxsize, $maxwidth... définissent les limites de tailles, de poids et les extensions des avatars. Vous pouvez les modifier comme vous voulez : sachez bien que la partie 2 de ce tutoriel permettra de le faire directement à partir du panneau d'admin (il en va de même pour toutes les données chiffrées de cette page).

- L'intérêt d'ajouter la fonction strtolower() (qui convertit une chaîne en minuscules) est que les extensions de vos fichiers images seront tous en minuscules. Ainsi, une extension .JPG sera quand même reconnue comme valide.


Et on ne vérifie pas la localisation ? :euh:


Bah, en fait, je ne vois pas trop ce qu'on peut vérifier dans ce champ. Aucune regex ne peut vérifier le nom d'une ville, et on peut le laisser vide.

On affiche le message !



Voilà : maintenant qu'on a fait tous nos tests, il reste plus qu'à afficher le message.

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<div id="corps_forum">
<a href ="./index.php">Index du forum</a> / <a href="./register.php">Inscription</a>
<?php
if ($i == 0) // Si i est vide, il n'y a pas d'erreur
{

        echo'<h1>Inscription terminée</h1>';
        echo'<p>Bienvenue '.stripslashes(htmlspecialchars($_POST['pseudo'])).' vous êtes maintenant inscrit sur le forum</p>';
        echo'<p>Cliquez <a href="./index.php">ici</a> pour revenir à la page d accueil</p>';

        if (isset($_FILES['avatar']['size']))
        {
                //On déplace l'avatar
                $avatar = time();
                $nomavatar = str_replace(' ','',$avatar).".".$extension_upload;
                $avatar = "./images/avatars/".str_replace(' ','',$avatar).".".$extension_upload;
                move_uploaded_file($_FILES['avatar']['tmp_name'],$avatar);
        }
              
       
        //On balance le tout dans notre table
        mysql_query('
        INSERT INTO forum_membres (membre_pseudo, membre_mdp, membre_email,             
        membre_msn, membre_siteweb, membre_avatar,
        membre_signature, membre_localisation, membre_inscrit,   
        membre_derniere_visite)
        VALUES ("'.$pseudo.'" , "'.$pass.'" , "'.$email.'" ,
        "'.$msn.'" , "'.$website.'" , "'.$nomavatar.'" ,
        "'.$signature.'" , "'.$localisation.'" ,  "'.$temps.'" ,
        "'.$temps.'" ) ') or die(mysql_error());
       
       
        //Et on définit les variables de sessions
        $_SESSION['pseudo'] = $pseudo;
        $_SESSION['id'] = mysql_insert_id();
        $_SESSION['level'] = 2;

}
else
{
        echo'<h1>Inscription interrompue</h1>';
        echo'<p>Une ou plusieurs erreurs se sont produites pendant l incription</p>';
        echo'<p>'.$i.' erreur(s)</p>';
        echo'<p>'.$pseudo_erreur1.'</p>';
        echo'<p>'.$pseudo_erreur2.'</p>';
        echo'<p>'.$mdp_erreur.'</p>';
        echo'<p>'.$email_erreur1.'</p>';
        echo'<p>'.$email_erreur2.'</p>';
        echo'<p>'.$msn_erreur.'</p>';
        echo'<p>'.$signature_erreur.'</p>';
        echo'<p>'.$avatar_erreur.'</p>';
        echo'<p>'.$avatar_erreur1.'</p>';
        echo'<p>'.$avatar_erreur2.'</p>';
        echo'<p>'.$avatar_erreur3.'</p>';
       
        echo'<p>Cliquez <a href="./register.php">ici</a> pour recommencer</p>';
}
mysql_close();
?>
</div>
</body>
</html>


Comment ça marche, ce code ? Notre variable $i nous indique le nombre d'erreurs, c'est pourquoi on a juste à vérifier qu'elle soit égale à 0 pour savoir si tout colle.
Et si jamais ce n'est pas le cas, on affiche tous les messages d'erreurs qu'on a créés auparavant.

Une fois que le tout est bouclé, on peut dire qu'on a terminé le système de login et d'inscription du forum. L'avantage par rapport à un forum comme phpbb, c'est que rien ne vous empêche de mettre les champs de connexions dans le menu plutôt que de mettre un lien (bon, c'était possible aussi avec phpbb, mais un peu plus compliqué ; puis là, vous savez comment marche votre système :) ).


Retour sur l'avatar



Revenons un peu sur cette partie du code :

Code : PHP
1
2
3
4
5
6
7
<?php
//On déplace l'avatar 
$avatar = time();
$nomavatar = str_replace(' ','',$avatar).".".$extension_upload;
$avatar = "./images/avatars/".str_replace(' ','',$avatar).".".$extension_upload;
move_uploaded_file($_FILES['avatar']['tmp_name'],$avatar);
?>


On s'occupe ici de déplacer l'avatar qui a été uploadé. Dans un premier temps, on lui donne le nom du timestamp actuel afin que celui-ci soit unique. Ensuite, on s'occupe d'ajouter l'extension. Le tout, nom de l'image + extension, est envoyé dans la base de données. Enfin, la fonction move_uploaded_file() déplace l'image dans le dossier images/avatars.

Il faut donc que vous ayez créé un dossier avatars dans le dossier images. Pensez donc à mettre un CHMOD correct (à priori, sous windows, il est inutile de changer quoi que ce soit).

Améliorations

Maintenant, avant de se lancer dans la suite, je vais donner quelques améliorations que vous pouvez rajouter si vous en avez envie. Cela dit, elles ne sont pas nécessaires au fonctionnement même du forum.

Mail



Envoyez un mail au membre qui vient de s'inscrire : pour cela, il suffit d'utiliser la fonction native mail de php. Si vous voulez plus de détails, regardez le code suivant :

Code : PHP
1
2
3
4
5
6
7
8
<?php
//Message
$message = "Bienvenue sur mon super forum !";
//Titre
$titre = "Inscription à mon super forum !";

mail($_POST['email'], $titre, $message);
?>


Vous pouvez rappeler dans ce mail le mot de passe et le pseudo.

L'usage de la fonction mail est limité à un nombre d'envois par mois chez certains hébergeurs.


Vous pouvez également faire un système d'enregistrement avec vérification par email de façon à ce que les membres n'entrent pas n'importe quoi comme adresse.
Un moyen de le faire est de créer au moment de l'inscription un code qu'on envoie ensuite par mail au futur membre, on ajoute du même coup 2 champs à la table forum_membres, un champ verif qui vaut 0 par défaut et qui sera mis à un une fois la vérification faite, et un champ code qui contiendra notre code.
On lui demande alors de se rendre sur une page spéciale du type /forum/verif_inscription.php?code=012457505 puis vous faites :
Code : PHP
1
2
3
<?
mysql_query('UPDATE forum_membres SET membre_verif = 1 WHERE membre_code = '.(int) $_GET['code']);
?>


cookie



Autre amélioration importante : pour l'instant, on utilise les variables de session pour reconnaître le membre ; rien ne vous empêche d'utiliser les cookies. Pour cela, il suffit de rajouter une checkbox en dessous du formulaire d'inscription :

Code : HTML
1
<label>Se souvenir de moi ?</label><input type="checkbox" name="souvenir" /><br />


Ensuite, vous devez créer un cookie dans la page connexionok.php.

Code : PHP
1
2
3
4
5
6
7
<?php
if (isset($_POST['souvenir']))
{
$expire = time() + 365*24*3600;
setcookie('pseudo', $_SESSION['pseudo'], $expire); 
}
?>

Vérifiez bien que ce bout de code a été placé dans la partie où vous savez que le pseudo et le mot de passe entrés sont les bons !


Ensuite, si l'utilisateur a bien coché l'option Se souvenir de moi, il sera automatiquement connecté en arrivant sur le site. Il faut donc rajouter dans toutes les pages (utiliser la page debut.php pour ça) ce bout de code :
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<?php
if (isset ($_COOKIE['pseudo']) && !isset ($_SESSION['pseudo']))
{
$_SESSION['pseudo'] = $_COOKIE['pseudo']; 

/* On créé la variable de session à partir du cookie pour ne pas avoir à vérifier 2 fois sur les pages qu'un membre est connecté. */

}
if (isset ($_COOKIE['pseudo']) && isset ($_SESSION['pseudo']))
{
//On est connecté
}
if (!isset ($_COOKIE['pseudo']) && !isset ($_SESSION['pseudo']))
{
//On n'est pas connecté
}
?>

Ça vous évitera d'avoir à modifier tous vos codes ^^ .

Et pour la déconnexion, il faut penser à supprimer aussi le cookie (sinon, on resterait connecté).

Code : PHP
1
2
3
4
5
6
7
8
<?php
session_start();
if (isset ($_COOKIE['pseudo']))
{
setcookie('pseudo', '', -1);
}
session_destroy();
?>


Comme cela, on met une date d'expiration négative au cookie, et ça marche !

Il faut également entrer le mot de passe dans le cookie afin d'éviter qu'une personne mal attentionnée modifie son cookie en y inscrivant le pseudo d'un autre membre.


Signature



Vous pouvez également autoriser les balises de mise en forme du texte (l'équivalent du bbcode) et les smilies dans la signature. Toutefois, vous n'allez pas pouvoir le faire avant d'avoir créé ce "code". Donc, patience ;) .

Système anti-bot



Les bots sont des petits programmes qui peuvent s'inscrire en remplissant des formulaires relativement simples. Afin d'éviter cela, certains forums proposent une image sur laquelle est écrit un code, composé de lettres et de chiffres qu'on vous demande de recopier. Pour savoir comment réaliser cette option, vous pouvez aller lire ce tuto sur ce site.


Voilà : je pense que c'est à peu près tout pour les améliorations qui peuvent être apportées à ce système de Connexion / Enregistrement.

Ah si, dernière chose : vous avez remarqué que le système de connexion / déconnexion utilise 3 pages... pas très pratique :( donc : si vous voulez éviter ça, vous pouvez très bien passer la valeur de la commande dans l'url de la page connexion.php et la récupérer avec $_GET.
Par exemple : connexion.php?action=déconnexion

A partir de maintenant, vous pouvez vous inscrire sur votre propre forum (pratique, hein ? :p ). Et les futurs visiteurs de ces pages pourront le faire aussi.

Le prochain chapitre est la suite logique de celui-ci, dans le sens où l'on va y traiter de l'affichage et de la modification du profil de chaque membre. Si vous gardez bien en tête ce qu'on vient de faire, ça devrait vraiment passer tout seul :) .
Chapitre précédent Sommaire Chapitre suivant
Retour en haut Retour en haut


Créé : le 13/09/2006 à 19:48:41
Modifié : le 01/09/2008 à 23:08:46
Avancement : 100%
Licence : Creative Commons BY

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 351 Zéros connectés | Requêtes SQL 8 requêtes | Temps de génération de la page : Total (SQL) 0.2802s (0.266s)