• Facile

Ce cours est visible gratuitement en ligne.

Vous pouvez être accompagné et mentoré par un professeur particulier par visioconférence sur ce cours.

J'ai tout compris !

Mis à jour le 07/01/2013

TP : connexion et déconnexion

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

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 !

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. :)

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
<?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
<?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é :

<?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.

<?php
if($_POST['validate'] != 'ok')
?>

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

<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. :)

Exemple de certificat de réussite
Exemple de certificat de réussite