Aller au menu - Aller au contenu

Icône Inscription et connexion

Avatar
Mise à jour : 30/11/2010
Difficulté : Facile Facile Creative Commons BY
4 145 visites depuis 7 jours, dont 527 sur ce chapitre classé 41/786
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 qui sera en fait la même page.

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
<?php
session_start();
$titre="Connexion";
include("includes/identifiants.php");
include("includes/debut.php");
include("includes/menu.php");
echo '<p><i>Vous êtes ici</i> : <a href="./index.php">Index du forum</a> --> Connexion';
?>


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
<?php
echo '<h1>Connexion</h1>';
if ($id!=0) erreur(ERR_IS_CO);
?>


Mais qu'est ce que c'est que ce truc !? o_O


Bon pour la première ligne je pense que ça ne pose pas de soucis, voyons un peu la seconde.
Ici on veut s'assurer que le visiteur qui arrive sur cette page n'est pas déjà connecté, c'est pour ça qu'on vérifie la valeur de la variable $id (je rappelle qu'elle contient 0 si le visiteur n'est pas connecté, l'id du membre sinon).
S'il y a un problème, on appelle la fonction erreur, cette fonction il va bien entendu falloir la déclarer quelque part, pour cela on va utiliser la page functions.php.

Code : PHP
1
2
3
4
5
6
7
8
<?php
function erreur($err='')
{
   $mess=($err!='')? $err:'Une erreur inconnue s\'est produite';
   exit('<p>'.$mess.'</p>
   <p>Cliquez <a href="./index.php">ici</a> pour revenir à la page d\'accueil</p></div></body></html>');
}
?>


Son fonctionnement est simple, elle arrête le script php en indiquant un message prédéfini, par défaut, le message est Une erreur inconnue s'est produite.
Bien entendu, il serait bon de ne pas oublier de déclarer toutes nos constantes et de créer ainsi autant de messages d'erreur que vous voulez.
Pour cela rendez-vous sur la page constants.php

Code : PHP
1
2
3
<?php
define('ERR_IS_CO','Vous ne pouvez pas accéder à cette page si vous n\'êtes pas connecté');
?>


Mais pourquoi tu t'embêtes comme ça ?! Tu peux pas simplement écrire le message dans la page ?


Si mais croyez moi on y gagne avec cette méthode, pas besoin de s'amuser à réécrire 120 fois le même message, parce que des erreurs il va falloir en afficher un bon paquet !
Autre avantage, avec cette méthode vous pouvez facilement personnaliser vos messages, ajouter une image, une couleur de fond etc... Il vous suffira d'écrire dans votre fonction erreur()

Code : PHP
1
2
3
4
<?php
exit('<div id="error"><p>'.$mess.'</p>
   <p>Cliquez <a href="./index.php">ici</a> pour revenir à la page d\'accueil</p></div></div></body></html>');
?>


Et d'aller définir error dans votre fichier CSS.

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

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
<?php
if (!isset($_POST['pseudo'])) //On est dans la page de formulaire
{
	echo '<form method="post" action="connexion.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" />
	</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 partie :) . Si elle est si courte, c'est parce que finalement, on a juste à afficher le formulaire ici.
Voici tout de même quelques explications.
Dans un premier temps, on vérifie donc que le visiteur n'est pas connecté, ensuite on regarde si la variable $_POST['pseudo'] est remplie, si ce n'est pas le cas, c'est que notre visiteur vient d'arriver et on lui affiche le formulaire.

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 partie traitement.

Cette partie 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é (cas déjà traité)
Soit le mot de passe est incorrect

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

Page : connexion.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
<?php
//On reprend la suite du code
else
{
    $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</p>
	<p>Cliquez <a href="./connexion.php">ici</a> pour revenir</p>';
    }
    else //On check le mot de passe
    {
        $query=$db->prepare('SELECT membre_mdp, membre_id, membre_rang, membre_pseudo
        FROM forum_membres WHERE membre_pseudo = :pseudo');
        $query->bindValue(':pseudo',$_POST['pseudo'], PDO::PARAM_STR);
        $query->execute();
        $data=$query->fetch();
	if ($data['membre_mdp'] == md5($_POST['password'])) // Acces OK !
	{
	    $_SESSION['pseudo'] = $data['membre_pseudo'];
	    $_SESSION['level'] = $data['membre_rang'];
	    $_SESSION['id'] = $data['membre_id'];
	    $message = '<p>Bienvenue '.$data['membre_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.<br /> Le mot de passe ou le pseudo 
            entré n\'est pas correcte.</p><p>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>';
	}
    $query->CloseCursor();
    }
    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 avec tout le reste.

Page : connexion.php

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


Ainsi il suffira de faire

Page : connexion.php

Code : PHP
1
2
3
4
<?php
$page = htmlspecialchars($_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
<?php
session_start();
session_destroy();
$titre="Déconnexion";
include("includes/debut.php");
include("includes/menu.php");

if ($id==0) erreur(ERR_IS_NOT_CO);

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.<br />
Cliquez <a href="./index.php">ici</a> pour revenir à la page principale</p>';
echo '</div></body></html>';
?>


Voilà, tout ce qu'on fait c'est appeler la fonction session_destroy pour détruire les variables de session.
Bien sur cette fois on vérifie que le visiteur est bien connecté, à vous de créer la constante adéquate.
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 !

Formulaire



Comme pour le système de connexion, on va diviser la page en deux parties: une pour le formulaire, et l'autre pour le traitement des données envoyées. Pour le nom, je n'ai rien trouvé de plus glamour que register.php on va faire avec pour l'instant :p .

Comme tout à l'heure, la partie formulaire est vraiment simple et courte, voyons d'abord le début :

Page : register.php

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php
session_start();
$titre="Enregistrement";
include("includes/identifiants.php");
include("includes/debut.php");
include("includes/menu.php");
echo '<p><i>Vous êtes ici</i> : <a href="./index.php">Index du forum</a> --> Enregistrement';

if ($id!=0) erreur(ERR_IS_CO);
?>


Vous voyez qu'on retrouve la fonction erreur, on commence à en voir l'utilité, c'est quand même plus rapide que de se farcir le bloc if/then/else plus le message à chaque fois.

On continue avec l'affichage du formulaire :

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
if (empty($_POST['pseudo'])) // Si on la variable est vide, on peut considérer qu'on est sur la page de formulaire
{
	echo '<h1>Inscription 1/2</h1>';
	echo '<form method="post" action="register.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 : 10Ko<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>
	</div>
	</body>
	</html>';
	
	
} //Fin de la partie formulaire
?>


Analysons un peu ce code. Tout à l'heure on s'est assuré que l'utilisateur était bien un simple visiteur, ensuite il faut regarder si on est dans le cas de l'affichage du formulaire ou dans le cas du traitement, pour cela on s'intéresse à la variable $_POST['pseudo']. A priori, si celle-ci est vide, c'est qu'on vient d'arriver sur la page (à moins que le visiteur n'est oublié de renseigner son pseudo ce qui est assez étrange vous me le concèderez...). 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 deuxième partie de la page :pirate: !


Traitement



Exactement comme pour la page connexion.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.


Page : register.php

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<?php
else //On est dans le cas traitement
{
    $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'autres ç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
35
36
37
38
39
<?php

    //On récupère les variables
    $i = 0;
    $temps = time(); 
    $pseudo=$_POST['pseudo'];
    $signature = $_POST['signature'];
    $email = $_POST['email'];
    $msn = $_POST['msn'];
    $website = $_POST['website'];
    $localisation = $_POST['localisation'];
    $pass = md5($_POST['password']);
    $confirm = md5($_POST['confirm']);
	
    //Vérification du pseudo
    $query=$db->prepare('SELECT COUNT(*) AS nbr FROM forum_membres WHERE membre_pseudo =:pseudo');
    $query->bindValue(':pseudo',$pseudo, PDO::PARAM_STR);
    $query->execute();
    $pseudo_free=($query->fetchColumn()==0)?1:0;
    $query->CloseCursor();
    if(!$pseudo_free)
    {
        $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 une 4 lignes de code qui vous ont peut être posé un peu de soucis.
Code : PHP
1
2
3
4
5
6
<?php
$query=$db->prepare('SELECT COUNT(*) AS nbr FROM forum_membres WHERE membre_pseudo =:pseudo');
$query->bindValue(':pseudo',$pseudo, PDO::PARAM_STR);
$query->execute();
$pseudo_free=($query->fetchColumn()==0)?1:0;
?>


Bon pour les trois premières je pense que ça va, ce n'est qu'une simple requête tout ce qu'il y a de plus inoffensif. Pour la dernière, j'utilise la méthode fetchColumn() de l'objet $query qui va récupérer le nombre d'entrées correspondant à la requête.
Si celle-ci est 0, tout va bien et la variable booléenne $pseudo_free sera mise à vraie (ou 1, le pseudo n'est pas déjà utilisé). Sinon elle vaudra 0 (le pseudo est déjà utilisé). Dans ce dernier cas, 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
32
33
34
<?php
    //Vérification de l'adresse email

    //Il faut que l'adresse email n'ait jamais été utilisée
    $query=$db->prepare('SELECT COUNT(*) AS nbr FROM forum_membres WHERE membre_email =:mail');
    $query->bindValue(':mail',$email, PDO::PARAM_STR);
    $query->execute();
    $mail_free=($query->fetchColumn()==0)?1:0;
    $query->CloseCursor();
    
    if(!$mail_free)
    {
        $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
36
<?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 transfert 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
<?php
   if ($i==0)
   {
	echo'<h1>Inscription terminée</h1>';
        echo'<p>Bienvenue '.stripslashes(htmlspecialchars($_POST['pseudo'])).' vous êtes maintenant inscrit sur le forum</p>
	<p>Cliquez <a href="./index.php">ici</a> pour revenir à la page d accueil</p>';
	
        //La ligne suivante sera commentée plus bas
	$nomavatar=(!empty($_FILES['avatar']['size']))?move_avatar($_FILES['avatar']):''; 
   
        $query=$db->prepare('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)');
	$query->bindValue(':pseudo', $pseudo, PDO::PARAM_STR);
	$query->bindValue(':pass', $pass, PDO::PARAM_INT);
	$query->bindValue(':email', $email, PDO::PARAM_STR);
	$query->bindValue(':msn', $msn, PDO::PARAM_STR);
	$query->bindValue(':website', $website, PDO::PARAM_STR);
	$query->bindValue(':nomavatar', $nomavatar, PDO::PARAM_STR);
	$query->bindValue(':signature', $signature, PDO::PARAM_STR);
	$query->bindValue(':localisation', $localisation, PDO::PARAM_STR);
	$query->bindValue(':temps', $temps, PDO::PARAM_INT);
        $query->execute();

	//Et on définit les variables de sessions
        $_SESSION['pseudo'] = $pseudo;
        $_SESSION['id'] = $db->lastInsertId(); ;
        $_SESSION['level'] = 2;
        $query->CloseCursor();
    }
    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>';
    }
}
?>
</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 ligne :

Code : PHP
1
2
3
<?php
$nomavatar=(!empty($_FILES['avatar']['size']))?move_avatar($_FILES['avatar']):'';
?>


On s'occupe ici de déplacer l'avatar qui a été uploadé. Malheureusement pour vous, la fonction move_avatar n'est pas native de php, il va falloir la créer, pour cela, pas de panique, rendez-vous sur le fichier function.php.
La fonction move_avatar va prendre en argument la variable de type array $avatar qui contiendra les infos sur le fichier à uploader (je vous renvoie sur le tuto de DHKold pour plus de précisions), elle va renvoyer un message si l'upload s'est bien passé et s'occupera d'enregistrer le fichier.

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<?php
function move_avatar($avatar)
{
    $extension_upload = strtolower(substr(  strrchr($avatar['name'], '.')  ,1));
    $name = time();
    $nomavatar = str_replace(' ','',$name).".".$extension_upload;
    $name = "./images/avatars/".str_replace(' ','',$name).".".$extension_upload;
    move_uploaded_file($avatar['tmp_name'],$name);
    return $nomavatar;
}
?>


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 réaliser la requête suivante :
Code : PHP
1
2
3
<?php
UPDATE forum_membres SET membre_verif = 1 WHERE membre_code = :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 connexion.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']) && empty($id))
{
$_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']) && !empty($id))
{
//On est connecté
}
if (!isset ($_COOKIE['pseudo']) && empty($id))
{
//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 intentionné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 2 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

Partager

148 commentaires pour "Inscription et connexion"
Note moyenne : 3.61 / 4 (349 votes)
Pseudo Commentaire
Hors ligne amazigh97 # Posté le 28/08/2011 à 15:12:09
Saturday night !
Avatar

Slt tout le monde,
Je voulais vous demander si je suis obligé d'utiliser :
($id!=0) erreur(ERR_IS_CO).
En fait, je voulais savoir si ce bout de code peut etre remplacé par une fonction que voici :
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
class Auth{
 	
	static function connecte(){
		global $bd;
		if(isset($_SESSION['Auth']) && isset($_SESSION['Auth']['email']) && isset($_SESSION['Auth']['password'])){
			$q = array ('email'=>$_SESSION['Auth']['email'], 'password'=>$_SESSION['Auth']['password']);
			$sql = 'SELECT email,password FROM users WHERE email = :email AND password = :password';
	        $req = $cnx->prepare($sql);
            $req->execute($q);
			$count = $req->rowCount($sql);
			   if($count == 1){
			   	return true;
			   }
			   else{
			   	return false;
			   }
		}
		else{
			return false;
		}
	}
	
 }


Merci !

Ne vois pas que ce tu n'as pas
 
Hors ligne AsG1050 # Posté le 05/11/2011 à 15:54:09
Avatar

Bonjour,
Je suis arrivé à l'enregistrement mais j'ai des erreurs qui viennent.
Voila mon code de inscription.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
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<?php
echo (!empty($titre))?'<title>'.$titre.'</title>':'<title> Inscription sur le site EAK </title>';
?>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <meta http-equiv="Content-language" content="fr" />
       <link rel="stylesheet" media="screen" type="text/css" title="Design" href="../css/register.css"/>
         <link rel="icon" type="image/png" href="favicon.png" />
        <!--[if IE]><link rel="shortcut icon" type="image/x-icon" href="favicon.ico" /><![endif]-->
		<meta name="description" content="Site officiel de la team EAK sur Call Of Duty Modern Warfare 3 [PS3]" />
        <meta name="Author" content="Singh Aman" />
        <meta name="Category" content="Réseau sociale, team, ps3, playstation 3, psn, playstation network, blog, profil, tournoi "/>
        <meta name="copyright" content="Copyright © 2011 EAK. Tous Droits Réservés." />
        <meta name="keywords" content="site, Réseau sociale, réseau, team, amis, ps3, blog, chat, actualités, mw3, modern warfare 3, call of duty, mw2, jeux, TV, playstation 3, psn, playstation network, profil, tournoi" />
        <meta name="Publisher" content="Singh Aman">
        <meta name="robots" content="noodp,noydir" />
        <meta name="googlebot" content="noarchive"> 
    </head>
<body>

<?php
session_start();
$titre="Inscription";
include("includes/identifiants.php");
include("includes/debut.php");
include("header.php");

if ($id!=0) erreur(ERR_IS_CO);
?>

<div id="container">

<br/>

<p class="title">Inscription</p>

<?php
if (empty($_POST['pseudo'])) // Si on la variable est vide, on peut considérer qu'on est sur la page de formulaire
{
	echo '<form method="post" action="register.php" enctype="multipart/form-data">
	<fieldset>
	
	<legend>Identifiants</legend>
	
	<label for="pseudo">* Pseudo : </label>  
	
	<input name="pseudo" type="text" id="pseudo" maxlength="15" /> (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"><span>* Confirmer le mot de passe : <span></label>
	<input type="password" name="confirm" id="confirm" />
	
	</fieldset>
	
	<fieldset>
	<legend>Contacts</legend>
	
	<label for="email">
	* Votre adresse Mail : 
	</label>
	<input type="email" name="email" id="email" />
	
	<br />
	
	<label for="facebook">Identifiant facebook : </label><input type="text" name="facebook" id="facebook" />
	
	<br />
	
	<label for="website">Votre site web : </label>
	<input type="url" name="website" id="website" />
	
	<br />
	
	</fieldset>
	
	<fieldset>
	<legend>Informations supplémentaires</legend>
	
	<label for="localisation">* Localisation : </label>
	<select name="localisation" id="localisation" class="select">
	<optgroup label="Europe">
           <option value="belgique">Belgique</option>
           <option value="france">France</option>
           <option value="espagne">Espagne</option>
           <option value="italie">Italie</option>
           <option value="royaume-uni">Royaume-Uni</option>
	</optgroup>
	<optgroup label="Amérique">
           <option value="canada">Canada</option>
           <option value="etats-unis">Etats-Unis</option>
	</optgroup>
	<optgroup label="Asie">
           <option value="chine">Chine</option>
           <option value="japon">Japon</option>
		   <option value="inde">Inde</option>
		   <option value="pakistan">Pakistan</option>
	</optgroup>
		   <option value="autre">Autre</option>
       </select>
	<br/>
	
	<label for="sexe">* Sexe : </label>
	<input type="text" name="sexe" id="sexe" />
	<br/>
	
	<label for="age">* L\'âge : </label>
	<input type="text" name="age" id="age" />
	<br/>
	
	</fieldset>
	
	<fieldset>
	<legend>Profil sur le forum</legend>
	
	<label for="avatar">Choisissez votre avatar: </label><input type="file" name="avatar" id="avatar" />(Taille max : 10Ko)
	<br />
	<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>
	</div>
	</body>
	</html>';
	
	
} 
else
{

    $pseudo_erreur1 = NULL;
    $pseudo_erreur2 = NULL;
    $mdp_erreur = NULL;
    $email_erreur1 = NULL;
    $email_erreur2 = NULL;
    $signature_erreur = NULL;
    $avatar_erreur = NULL;
    $avatar_erreur1 = NULL;
    $avatar_erreur2 = NULL;
    $avatar_erreur3 = NULL;
}
?>
<?php

    //On récupère les variables
    $i = 0;
    $temps = time(); 
    $pseudo=$_POST['pseudo'];
    $signature = $_POST['signature'];
    $email = $_POST['email'];
    $facebook = $_POST['facebook'];
    $website = $_POST['website'];
    $localisation = $_POST['localisation'];
	$sexe = $_POST['sexe'];
	$age = $_POST['age'];
    $pass = md5($_POST['password']);
    $confirm = md5($_POST['confirm']);
	
    //Vérification du pseudo
    $query=$db->prepare('SELECT COUNT(*) AS nbr FROM forum_membres WHERE membre_pseudo =:pseudo');
    $query->bindValue(':pseudo',$pseudo, PDO::PARAM_STR);
    $query->execute();
    $pseudo_free=($query->fetchColumn()==0)?1:0;
    $query->CloseCursor();
    if(!$pseudo_free)
    {
        $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++;
    }
?>
<?php
$query=$db->prepare('SELECT COUNT(*) AS nbr FROM forum_membres WHERE membre_pseudo =:pseudo');
$query->bindValue(':pseudo',$pseudo, PDO::PARAM_STR);
$query->execute();
$pseudo_free=($query->fetchColumn()==0)?1:0;
?>
<?php
    //Vérification de l'adresse email

    //Il faut que l'adresse email n'ait jamais été utilisée
    $query=$db->prepare('SELECT COUNT(*) AS nbr FROM forum_membres WHERE membre_email =:mail');
    $query->bindValue(':mail',$email, PDO::PARAM_STR);
    $query->execute();
    $mail_free=($query->fetchColumn()==0)?1:0;
    $query->CloseCursor();
    
    if(!$mail_free)
    {
        $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 la signature
    if (strlen($signature) > 200)
    {
        $signature_erreur = "Votre signature est trop longue";
        $i++;
    }
?>
<?php
    //Vérification de l'avatar :
    if (!empty($_FILES['avatar']['size']))
    {
        //On définit les variables :
        $maxsize = 1000024; //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 transfert 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 = "L'extension de l'avatar est incorrecte";
        }
    }
?>
<?php
   if ($i==0)
   {
	echo'<h1>Inscription terminée</h1>';
        echo'<p>Bienvenue '.stripslashes(htmlspecialchars($_POST['pseudo'])).' vous êtes maintenant inscrit sur le forum et le site</p>
	<p>Cliquez <a href="./index.php">ici</a> pour revenir à la page d accueil</p>';
	
        //La ligne suivante sera commentée plus bas
	$nomavatar=(!empty($_FILES['avatar']['size']))?move_avatar($_FILES['avatar']):''; 
   
        $query=$db->prepare('INSERT INTO forum_membres (membre_pseudo, membre_mdp, membre_email,         membre_sexe, membre_age, membre_facebook,
        , membre_siteweb, membre_avatar,
        membre_signature, membre_localisation, membre_inscrit,   
        membre_derniere_visite)
        VALUES (:pseudo, :pass, :sexe, :age, :email, :facebook, :website, :nomavatar, :signature, :localisation, :temps, :temps)');
	$query->bindValue(':pseudo', $pseudo, PDO::PARAM_STR);
	$query->bindValue(':pass', $pass, PDO::PARAM_INT);
	$query->bindValue(':sexe', $sexe, PDO::PARAM_STR);
	$query->bindValue(':age', $age, PDO::PARAM_STR);
	$query->bindValue(':email', $email, PDO::PARAM_STR);
	$query->bindValue(':facebook', $facebook, PDO::PARAM_STR);
	$query->bindValue(':website', $website, PDO::PARAM_STR);
	$query->bindValue(':nomavatar', $nomavatar, PDO::PARAM_STR);
	$query->bindValue(':signature', $signature, PDO::PARAM_STR);
	$query->bindValue(':localisation', $localisation, PDO::PARAM_STR);
	$query->bindValue(':temps', $temps, PDO::PARAM_INT);
        $query->execute();

	//Et on définit les variables de sessions
        $_SESSION['pseudo'] = $pseudo;
        $_SESSION['id'] = $db->lastInsertId();
        $_SESSION['level'] = 2;
        $query->CloseCursor();
    }
    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>'.$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="./inscription.php">ici</a> pour recommencer</p>';
    }
?>
</div>

</body>
</html>


Et ma liste d'erreur (il me dise que les variables ne sont pas définies mais je ne comprend pas comment les définir):
Secret (cliquez pour afficher)


( ! ) Notice: Undefined index: pseudo in C:\wamp\www\M29\forum\inscription.php on line 160
Call Stack
# Time Memory Function Location
1 0.0011 437728 {main}( ) ..\inscription.php:0

( ! ) Notice: Undefined index: signature in C:\wamp\www\M29\forum\inscription.php on line 161
Call Stack
# Time Memory Function Location
1 0.0011 437728 {main}( ) ..\inscription.php:0

( ! ) Notice: Undefined index: email in C:\wamp\www\M29\forum\inscription.php on line 162
Call Stack
# Time Memory Function Location
1 0.0011 437728 {main}( ) ..\inscription.php:0

( ! ) Notice: Undefined index: facebook in C:\wamp\www\M29\forum\inscription.php on line 163
Call Stack
# Time Memory Function Location
1 0.0011 437728 {main}( ) ..\inscription.php:0

( ! ) Notice: Undefined index: website in C:\wamp\www\M29\forum\inscription.php on line 164
Call Stack
# Time Memory Function Location
1 0.0011 437728 {main}( ) ..\inscription.php:0

( ! ) Notice: Undefined index: localisation in C:\wamp\www\M29\forum\inscription.php on line 165
Call Stack
# Time Memory Function Location
1 0.0011 437728 {main}( ) ..\inscription.php:0

( ! ) Notice: Undefined index: sexe in C:\wamp\www\M29\forum\inscription.php on line 166
Call Stack
# Time Memory Function Location
1 0.0011 437728 {main}( ) ..\inscription.php:0

( ! ) Notice: Undefined index: age in C:\wamp\www\M29\forum\inscription.php on line 167
Call Stack
# Time Memory Function Location
1 0.0011 437728 {main}( ) ..\inscription.php:0

( ! ) Notice: Undefined index: password in C:\wamp\www\M29\forum\inscription.php on line 168
Call Stack
# Time Memory Function Location
1 0.0011 437728 {main}( ) ..\inscription.php:0

( ! ) Notice: Undefined index: confirm in C:\wamp\www\M29\forum\inscription.php on line 169
Call Stack
# Time Memory Function Location
1 0.0011 437728 {main}( ) ..\inscription.php:0
Inscription interrompue

Une ou plusieurs erreurs se sont produites pendant l'incription

2 erreur(s)

( ! ) Notice: Undefined variable: pseudo_erreur1 in C:\wamp\www\M29\forum\inscription.php on line 306
Call Stack
# Time Memory Function Location
1 0.0011 437728 {main}( ) ..\inscription.php:0

Votre pseudo est soit trop grand, soit trop petit

( ! ) Notice: Undefined variable: mdp_erreur in C:\wamp\www\M29\forum\inscription.php on line 308
Call Stack
# Time Memory Function Location
1 0.0011 437728 {main}( ) ..\inscription.php:0


( ! ) Notice: Undefined variable: email_erreur1 in C:\wamp\www\M29\forum\inscription.php on line 309
Call Stack
# Time Memory Function Location
1 0.0011 437728 {main}( ) ..\inscription.php:0

Votre adresse E-Mail n'a pas un format valide

( ! ) Notice: Undefined variable: signature_erreur in C:\wamp\www\M29\forum\inscription.php on line 311
Call Stack
# Time Memory Function Location
1 0.0011 437728 {main}( ) ..\inscription.php:0


( ! ) Notice: Undefined variable: avatar_erreur in C:\wamp\www\M29\forum\inscription.php on line 312
Call Stack
# Time Memory Function Location
1 0.0011 437728 {main}( ) ..\inscription.php:0


( ! ) Notice: Undefined variable: avatar_erreur1 in C:\wamp\www\M29\forum\inscription.php on line 313
Call Stack
# Time Memory Function Location
1 0.0011 437728 {main}( ) ..\inscription.php:0


( ! ) Notice: Undefined variable: avatar_erreur2 in C:\wamp\www\M29\forum\inscription.php on line 314
Call Stack
# Time Memory Function Location
1 0.0011 437728 {main}( ) ..\inscription.php:0


( ! ) Notice: Undefined variable: avatar_erreur3 in C:\wamp\www\M29\forum\inscription.php on line 315
Call Stack
# Time Memory Function Location
1 0.0011 437728 {main}( ) ..\inscription.php:0

Cliquez ici pour recommencer
Hors ligne wisleur # Posté le 20/01/2012 à 16:50:19

J'ai trouvé une faille dans le code de connexion en ce qui concerne le pseudo :
Code : PHP
1
2
<?php 
if ($data['membre_mdp'] == md5($_POST['password'])) ?>

En faisant cela le script ne va vérifier que le mot de passe, et donc si on utilise un pseudo qui n'existe pas dans la BDD, on pourrait se connecter avec ce pseudo. C'est pourquoi il faut aussi vérifier le pseudo :
Code : PHP
1
2
<?php 
if ($data['membre_mdp'] == md5($_POST['password']) && $data['membre_pseudo'] == ($_POST['pseudo'])) ?>

Je ne suis qu'un novice, mais quand j'ai fais ma page de connexion sans vérifier le pseudo, je pouvais me connecter avec n'importe quel pseudo.
Hors ligne o00o # Posté le 04/04/2012 à 18:23:21

Avis : Mitigé Groupe : Bannis

Le cours n'est pas très bien expliqué, j'ai beaucoup d'erreur dans mon code sur toutes les pages ayant du PHP, tu devrais faire un code final.

D'ailleurs, si quelqu'un à compris et qu'il veut m'aider, je veut bien un code final.

Merci d'avance.

Cordialement.

Sami.

I am a legend, and...
Legends never die !


HTML5/CSS3: ||||||||||
PHP/MySQL: ||||||||||
JavaScript: ||||||||||
 
Hors ligne simWEEN # Posté le 08/05/2012 à 19:36:14
Il est toujours de bonhumeur..
Avatar

Avis : Mitigé

Déçu...

J'ai repris le tuto de zéro, et j'arrive à avoir une erreur...

Parse error: syntax error, unexpected T_ELSE in /var/www/legtux.org/users/nomisgroupe/sialma/forum/connexion.php on line 34
 

Voir tous les commentaires