Aller au menu - Aller au contenu

Icône TP : connexion et déconnexion

Avatar
Mise à jour : 11/11/2009
Difficulté : Facile Facile Creative Commons BY-NC-SA
2 398 visites depuis 7 jours, dont 212 sur ce chapitre classé 62/786
Dans ce chapitre, nous allons voir comment nous connecter et nous déconnecter.
Nous allons également faire un petit système utilisant les cookies pour faire une connexion automatique sans avoir besoin de rentrer les informations de connexion.

Vous verrez, ce n'est vraiment pas compliqué, en plus, ce n'est même pas long. ^^

C'est parti !
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Prérequis et explications

Bon : avant de nous lancer dans notre premier TP ensemble, je vais résumer ce que j'attends de vous, et comment je vois les choses. :)

connexion.php



Cette page, comme vous vous en doutez, contiendra le formulaire de connexion au site.
Je voudrais que le formulaire de connexion et la page validant la connexion ne fassent justement qu'une seule et même page.
Par conséquent, je vous invite à utiliser un champ hidden et à tester sa valeur pour savoir si vous êtes en phase validation ou non. :)

Cette page vérifiera si le visiteur est connecté ou non, si le pseudo est bon, si le mot de passe est bon, s'il existe des doublons dans votre base de données (normalement c'est impossible, mais on est sûr de rien).

Si tout roule, on valide la connexion et on crée les variables de session.
Sinon, on utilise information.php. :)

Si le mot de passe est erroné, je veux que la page se rappelle du pseudo entré par le visiteur.


deconnexion.php



Cette page détruit sessions et cookies et appelle information.php.
Rien de plus simple. :D

Vous n'avez pas besoin de conseils, vous pouvez très bien y arriver tout seuls. :)

Allez, c'est parti !

Correction

Bon, ben nous y voilà. :p

Je vous donne les corrections, et j'expliquerai deux ou trois choses qui me semblent importantes. :)

membres / connexion.php


Secret (cliquez pour afficher)
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
<?php
/*
Neoterranos & LkY
Page connexion.php

Permet de se connecter au site.

Quelques indications : (Utiliser l'outil de recherche et rechercher les mentions données)

Liste des fonctions :
--------------------------
Aucune fonction
--------------------------


Liste des informations/erreurs :
--------------------------
Membre qui essaie de se connecter alors qu'il l'est déjà
Vous êtes bien connecté
Erreur de mot de passe
Erreur de pseudo doublon (normalement impossible)
Pseudo inconnu
--------------------------
*/

session_start();
header('Content-type: text/html; charset=utf-8');
include('../includes/config.php');

/********Actualisation de la session...**********/

include('../includes/fonctions.php');
connexionbdd();
actualiser_session();

/********Fin actualisation de session...**********/

if(isset($_SESSION['membre_id']))
{
	$informations = Array(/*Membre qui essaie de se connecter alors qu'il l'est déjà*/
					true,
					'Vous êtes déjà connecté',
					'Vous êtes déjà connecté avec le pseudo <span class="pseudo">'.htmlspecialchars($_SESSION['membre_pseudo'], ENT_QUOTES).'</span>.',
					' - <a href="'.ROOTPATH.'/membres/deconnexion.php">Se déconnecter</a>',
					ROOTPATH.'/index.php',
					5
					);
	
	require_once('../information.php');
	exit();
}

if($_POST['validate'] != 'ok')
{
/********Entête et titre de page*********/

$titre = 'Connexion';

include('../includes/haut.php'); //contient le doctype, et head.

/**********Fin entête et titre***********/
?>		
		<div id="colonne_gauche">
		<?php
		include('../includes/colg.php');
		?>
		</div>
		
		<div id="contenu">
			<div id="map">
				<a href="../index.php">Accueil</a> => <a href="connexion.php">Connexion</a>
			</div>
					
			<h1>Formulaire de connexion</h1>
			<p>Pour vous connecter, indiquez votre pseudo et votre mot de passe.<br/>
			Vous pouvez aussi cocher l'option "Me connecter automatiquement à mon
			prochain passage." pour laisser une trace sur votre ordinateur pour être
			connecté automatiquement.<br/>
			Ce système de trace est basé sur les cookies, ce sont des petits fichiers
			contenant votre numéro d'identification ainsi qu'une version cryptée de votre
			mot de passe. Ces fichiers ne peuvent en aucun cas endommager votre ordinateur,
			ni l'affecter d'aucune façons, vous pourrez les supprimer à tout moment dans
			les options de votre navigateur.</p>
			
			<form name="connexion" id="connexion" method="post" action="connexion.php">
				<fieldset><legend>Connexion</legend>
					<label for="pseudo" class="float">Pseudo :</label> <input type="text" name="pseudo" id="pseudo" value="<?php if(isset($_SESSION['connexion_pseudo'])) echo $_SESSION['connexion_pseudo']; ?>"/><br/>
					<label for="mdp" class="float">Passe :</label> <input type="password" name="mdp" id="mdp"/><br/>
					<input type="hidden" name="validate" id="validate" value="ok"/>
					<input type="checkbox" name="cookie" id="cookie"/> <label for="cookie">Me connecter automatiquement à mon prochain passage.</label><br/>
					<div class="center"><input type="submit" value="Connexion" /></div>
				</fieldset>
			</form>
			
			<h1>Options</h1>
			<p><a href="inscription.php">Je ne suis pas inscrit !</a><br/>
			<a href="moncompte.php?action=reset">J'ai oublié mon mot de passe !</a>
			</p>
			<?php
}
			
			else
			{
				$result = sqlquery("SELECT COUNT(membre_id) AS nbr, membre_id, membre_pseudo, membre_mdp FROM membres WHERE
				membre_pseudo = '".mysql_real_escape_string($_POST['pseudo'])."' GROUP BY membre_id", 1);
				
				if($result['nbr'] == 1)
				{
					if(md5($_POST['mdp']) == $result['membre_mdp'])
					{
						$_SESSION['membre_id'] = $result['membre_id'];
						$_SESSION['membre_pseudo'] = $result['membre_pseudo'];
						$_SESSION['membre_mdp'] = $result['membre_mdp'];
						unset($_SESSION['connexion_pseudo']);
						
						if(isset($_POST['cookie']) && $_POST['cookie'] == 'on')
						{
							setcookie('membre_id', $result['membre_id'], time()+365*24*3600);
							setcookie('membre_mdp', $result['membre_mdp'], time()+365*24*3600);
						}
						
						$informations = Array(/*Vous êtes bien connecté*/
										false,
										'Connexion réussie',
										'Vous êtes désormais connecté avec le pseudo <span class="pseudo">'.htmlspecialchars($_SESSION['membre_pseudo'], ENT_QUOTES).'</span>.',
										'',
										ROOTPATH.'/index.php',
										3
										);
						require_once('../information.php');
						exit();
					}
					
					else
					{
						$_SESSION['connexion_pseudo'] = $_POST['pseudo'];
						$informations = Array(/*Erreur de mot de passe*/
										true,
										'Mauvais mot de passe',
										'Vous avez fourni un mot de passe incorrect.',
										' - <a href="'.ROOTPATH.'/index.php">Index</a>',
										ROOTPATH.'/membres/connexion.php',
										3
										);
						require_once('../information.php');
						exit();
					}
				}
				
				else if($result['nbr'] > 1)
				{
					$informations = Array(/*Erreur de pseudo doublon (normalement impossible)*/
									true,
									'Doublon',
									'Deux membres ou plus ont le même pseudo, contactez un administrateur pour régler le problème.',
									' - <a href="'.ROOTPATH.'/index.php">Index</a>',
									ROOTPATH.'/contact.php',
									3
									);
					require_once('../information.php');
					exit();
				}
				
				else
				{
					$informations = Array(/*Pseudo inconnu*/
									true,
									'Pseudo inconnu',
									'Le pseudo <span class="pseudo">'.htmlspecialchars($_POST['pseudo'], ENT_QUOTES).'</span> n\'existe pas dans notre base de données. Vous avez probablement fait une erreur.',
									' - <a href="'.ROOTPATH.'/index.php">Index</a>',
									ROOTPATH.'/membres/connexion.php',
									5
									);
					require_once('../information.php');
					exit();
				}
			}
			?>			
		</div>

		<?php
		include('../includes/bas.php');
		mysql_close();
		?>


membres / deconnexion.php


Secret (cliquez pour afficher)
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
<?php
/*
Neoterranos & LkY
Page deconnexion.php

Permet de se déconnecter du site.

Quelques indications : (Utiliser l'outil de recherche et rechercher les mentions données)

Liste des fonctions :
--------------------------
Aucune fonction
--------------------------


Liste des informations/erreurs :
--------------------------
Déconnexion
--------------------------
*/

session_start();
include('../includes/config.php');
include('../includes/fonctions.php');
connexionbdd();
mysql_query("DELETE FROM connectes WHERE connectes_id = ".$_SESSION['membre_id']) or exit(mysql_error());
vider_cookie();
session_destroy();

$informations = Array(/*Déconnexion*/
				false,
				'Déconnexion',
				'Vous êtes à présent déconnecté.',
				' - <a href="'.ROOTPATH.'/membres/connexion.php">Se connecter</a>',
				ROOTPATH.'/index.php',
				5
				);

require_once('../information.php');
exit();
?>


connexion.php



Déjà, ma manière de faire qu'un formulaire et sa validation soient sur la même page consiste à utiliser une variable post qui se trouvera dans un input caché du formulaire. C'est une méthode ; on pourrait aussi vérifier un des champs du formulaire, mais pour des raisons pratiques, je ne le fais pas : comme ça, si je modifie le formulaire, je ne touche pas à ce champ et la page reste valable.
Niveau SQL, beaucoup de monde fait une requête type SELECT * WHERE pseudo=$_POST['pseudo'] AND passe=$_POST['passe'] : je n'utilise pas cette méthode, non pas parce qu'elle est moins bien, juste parce que j'ai l'habitude de celle que je vous propose. En plus, ça me permettait de vous montrer comment sélectionner des données et faire un COUNT() en même temps ; en effet, essayez en retirant GROUP BY membre_id , vous aurez droit à une belle erreur.

À vrai dire, on se fiche pas mal de pouvoir faire un count et un select ici, mais bon, comme ça, vous le saurez à l'avenir. :)
L'option se souvenir de moi est tout ce qu'il y a de plus banal.
Bref, cette correction vous révèle certains de mes tics en PHP, pas forcément mieux ni même bien, mais ce sont les miens : ce sont des automatismes, et je vous invite à les modifier s'ils ne vous plaisent pas, et à me dire en commentaire si pour une raison ou pour une autre, vous estimez que je devrais éditer ces codes pour utiliser des méthodes différentes.

Pour en revenir aux actions de la page, elle fait bien tout ce que je vous ai raconté :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<?php
if(isset($_SESSION['membre_id']))
{
	$informations = Array(/*Membre qui essaie de se connecter alors qu'il l'est déjà*/
					true,
					'Vous êtes déjà connecté',
					'Vous êtes déjà connecté avec le pseudo <span class="pseudo">'.htmlspecialchars($_SESSION['membre_pseudo'], ENT_QUOTES).'</span>.',
					' - <a href="'.ROOTPATH.'/membres/deconnexion.php">Se déconnecter</a>',
					ROOTPATH.'/index.php',
					5
					);
	
	require_once('../information.php');
	exit();
}
?>


Ici on vérifie le statut du visiteur, on pourrait le renvoyer bêtement à l'index, mais contrairement à l'inscription, la connexion est assez fréquente, il suffit que l'utilisateur ait le lien vers la connexion en historique et il se fait refouler sans précisions, contrairement à l'inscription, je mets un message.

Code : PHP
1
2
3
<?php
if($_POST['validate'] != 'ok')
?>

Voilà ma variable cachée en action. :p

Code : PHP
1
<label for="pseudo" class="float">Pseudo :</label> <input type="text" name="pseudo" id="pseudo" value="<?php if(isset($_SESSION['connexion_pseudo'])) echo $_SESSION['connexion_pseudo']; ?>"/><br/>

Ici la variable souvenir .

Le reste c'est du test de pseudo, mot de passe et affichage d'erreurs. ^^

deconnexion.php



Ici, rien de compliqué non plus : je vide les cookies, j'efface les sessions, et j'affiche un message pour confirmer que le membre s'est déconnecté. :)

Et après ?

Comme vous l'avez remarqué, ce n'était vraiment pas difficile. :)

Ce chapitre était en fait vraiment simple, le but était de vous donner un peu de boulot, faudrait pas que je sois le seul à bosser. :p

Sachez cependant que le prochain chapitre sera un TP peut-être un peu plus difficile : il faudra réfléchir et s'y retrouver entre les statistiques stats.php et l'affichage des profils user.php.

Avant de nous quitter, je vous propose cependant quelques améliorations pour le système de connexion / déconnexion.

1°) Quand tout est bon, on valide, et un beau message (de préférence centré) apparaît pour dire au membre qu'il est connecté. À l'inverse, quand le mot de passe est mauvais, ou quand le pseudo est inconnu, on affiche aussi une erreur avec information.php.
Ça a des avantages (clarté), mais aussi des inconvénients (obligé de recharger la page connexion.php).
Pourquoi ne pas incorporer les messages d'erreur dans la page connexion.php ?
Il faut retravailler le code pour mettre un div avant le formulaire qui affichera les erreurs éventuelles.

2°) La déconnexion c'est sympa, mais il se peut (je ne sais pas) que le membre ne veuille pas se déconnecter, mais juste réinitialiser ses cookies ou les effacer.
Pourquoi ne pas mettre une page déconnexion avec les trois options et utiliser une variable get pour effectuer l'action voulue par l'utilisateur ?
Pareil, ça a ses plus et ses moins : l'utilisateur impatient dira que ça sert à rien, l'utilisateur pointilleux trouvera ça génial. :)

3°) Et si, au lieu de faire une page connexion et une page deconnexion, vous faisiez une seule page (statut.php par exemple) qui gère le tout (encore des variables get ) ?
Là pour le coup, l'inconvénient est la gestion des cas, l'avantage est d'éviter d'avoir des pages avec seulement 15 lignes de code, et puis certains préfèrent comme ça. :)

4°) Vous pourriez rajouter une redirection de trait-inscription.php vers connexion.php avec un timer de 5 à 10 secondes.

Voilà, ce sont quelques idées, juste pour vous rappeler que c'est vous qui personnalisez votre système, pas moi. :p
Ce chapitre TP touche à sa fin.
Pour ceux qui n'ont pas réussi, ce n'est pas grave, vous ferez mieux dans pas longtemps. :)

Je vous annonce que le prochain chapitre est aussi un TP, car il reprend essentiellement des points abordés chapitre 3.

Allons-y. :)
Chapitre précédent Sommaire Chapitre suivant

Partager

20 commentaires pour "TP : connexion et déconnexion"
Note moyenne : 3.01 / 4 (137 votes)
Pseudo Commentaire
Hors ligne UlysseUlysse # Posté le 03/02/2010 à 14:47:07

Bon tutoriel pour les descriptions et détails du code, par contre pour la mise en oeuvre une expérience "solide" est obligatoire.

La difficulté annoncée, à mon avis, est sous-estimée pour ce cours qui demande beaucoup de pratique et de rigueur. Bon pour un Zéro qui a déjà de très bonne base pour structurer son code. Pour les autres c'est la noyade à coup sur..... :euh:
Hors ligne foxprox # Posté le 21/04/2010 à 16:01:34

Bonjour, j'ai du mal à comprendre ce qu'il se passe la page "deconnexion". Pourriez vous m'expliquer? svp

Code : PHP
1
2
3
<?php
mysql_query("DELETE FROM connectes WHERE connectes_id = ".$_SESSION['membre_id']) or exit(mysql_error());
?>


j'ai crée la table "connectes" et la déconnexion s'effectue correctement,
mais à quoi sert cette table, car quand j'effectue une connexion rien ne s'écrit dans cette table.

merci pour votre aide
Hors ligne besky # Posté le 27/04/2010 à 18:53:56
Internet Services & Solutions
Avatar

Ville : Avrillé
Pays : France métropolitaine

Bon alors j'vais ajouter mon grain de sel.

Selon moi ce tutoriel n'est pas fini et quand bien même il le serait il y a des variables qui sont inutiles, par exemple: $_SESSION['connexion_pseudo']

Cette variable n'existe pas avant donc on se demande bien à quoi elle peut servir. Perso je la met à la poubelle. Il manque aussi pas mal de choses par exemple dans notre base de donnée on à un champ "membre_banni" bah ce serait bien de s'en servir quand même car si un membre a été bannis actuellement ca ne l'empêche pas de se connecter... alors qu'il suffit de rajouter une simple condition.

La table "connectes" ne sert à rien et n'est citée nul part ailleurs. Si le but est de savoir quand la personne s'est connectée je pense qu'il serait plus judicieux de mettre une requête avec un petit UPDATE sur le champ "membre_derniere_visite" de la table "membres". Ensuite pour faire par exemple un module avec les pseudo des membres connectés suffit de faire une requête qui demande bien gentiment à notre base de données qui s'est connecté depuis disons 20 minutes par exemple.

Puis très franchement je pense que tu à repiqué le code quelque part, que tu l'a très certainement modifié mais surtout sans le tester car même en faisant du copier/coller c'est pas prêt de fonctionner.

Alors bon c'est très gentil de vouloir proposer de l'aide aux débutants mais il faut d'abords être sur de ne pas les embrouiller plus qu'il ne le sont. Pour moi ce tuto n'est pas fini et devrait par conséquent ne pas être en ligne pour le moment... Mais ou sont les validateurs ?

Pour conclure je conseillerais aux débutants d'éviter de suivre ce tutoriel.

Désolé pour cette critique sévère mais juste malgré tout je pense.
 
Hors ligne Ramou # Posté le 07/12/2011 à 23:41:23

Avis : Mitigé

tuto certe incomplet mais le résultat est plutôt réussi, moi qui n'y connais rien en php (a cause de ma mémoire de poisson rouge) je peux pas dire que il est bien conçu pour l'apprentissage mais moi il me suffit, a ceci près:
- manque la validation par l'admin pour les nouveaux inscrits (avant qu'ils puissent utiliser le site), très important pour moi.
- j'ai pas compris comment faire pour que seuls les membres accèdent a certaines page mais ça je crois pouvoir y arriver tout seul.
- et puis les erreurs de variables non définies... ça fais pas sérieux... et pour ne plus avoir ce message j'ai modifié mon fichier "php.ini":
j'ai remplacé la ligne "error_reporting = E_ALL" par "error_reporting = E_ALL & ~E_NOTICE"

Voila j'ai vidé mon sac parce que j'ai passé mon WE dessus ya 2 semaines et puis bin ya rien qui fonctionnait alors j'étais dégouté et carrément déprimé pour etre honnete.

Mais bon là j'ai plus d'erreurs masqué les erreurs et le suis heureux tout fonctionne.
A part le dernier TP avec les stats et le profil parce que j'en ai carrément rien a f... ^^
(c'est pour un site privé donc y aura genre 30 inscrits grand max et 2 connectés grand max, dont moi...)
Hors ligne Godric Croft # Posté le 12/05/2012 à 17:53:13
On aime quand youtube charge
Avatar

Avis : Bon

Ville : Coudekerque-village
Pays : France métropolitaine

Bon tutoriel, mais bon je trouve que pour la page avec un anti-pompage, franchement j'ai essayer, d’ailleurs j'ai pas réussis, il faut de très solide connaissance en php/(x)html, car la y a quand même 200lignes

!!! Ceci est ma signature !!!
Code : Console
La vie est dans la boite noire de MS-DOS
 

Voir tous les commentaires
Ce tutoriel a été corrigé par les zCorrecteurs.