PHP/MySQL – créer un système d’utilisateur pour se connecter

Créé le : 22 octobre 2016
Catégorie: Divers
Mise à jour : 24 octobre 2016

PHP/MySQL – créer un système d’utilisateur pour se connecter

Description d’un système complet de gestion d’utilisateurs en PHP avec MySQL.
Pour faire simple on va utiliser cet exemple:

  • index.php : première page du site, celle qui contient le formulaire d’authentification
  • main.php : page principale de votre site
  • disconnect.php : page permettant la déconnexion
  • membre.php : page permettant de changer son mot de passe une fois connecté
  • users.php : page permettant d’ajouter un utilisateur
  • connect.php : fichier contenant les infos de connexion

schema_connexion_php_mysql

Créer le fichier de connexion

connect.php permet de centraliser les données de connexion à votre base

<?php
         //On se connecte à la base de données
         $host = "adresse.du.serveur.mysql";
         $user = "votre_utilisateur_mysql";
         $passBD = "votre_mot_de_passe_mysql";
         $bdd = "le_nom_de_la_base_mysql";
         mysql_connect($host,$user,$passBD) or die ("Impossible de se connecter à $host");
         mysql_select_db($bdd) or die ("Impossible de se connecter à $host");
 ?>

Se connecter

Code de la page index.php, première page sur laquelle on arrive quand on tape l’adresse du site internet

Formulaire de connexion et si on s’est déjà authentifié validation du login / mot de passe avant redirection vers main.php

<?php
//source : http://www.lephpfacile.com/howto/10-comment-faire-un-espace-membre-en-php


// on teste si le visiteur a soumis le formulaire de connexion
if (isset($_POST['connexion']) && $_POST['connexion'] == 'Connexion') {
    if ((isset($_POST['login']) && !empty($_POST['login'])) && (isset($_POST['pass']) && !empty($_POST['pass']))) {

    include 'connect.php';
    

    // on teste si une entrée de la base contient ce couple login / pass
    $sql = 'SELECT count(*) FROM votre_table WHERE login="'.mysql_escape_string($_POST['login']).'" AND pass_md5="'.mysql_escape_string(md5($_POST['pass'])).'"';
    $req = mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error());
    $data = mysql_fetch_array($req);

    mysql_free_result($req);
    mysql_close();

    // si on obtient une réponse, alors l'utilisateur est un membre
    if ($data[0] == 1) {
        
        //ouverture d'une session utilisateur
                   session_start();                    
                   $_SESSION['login'] = $_POST['login'];
		    header('Location: membre.php');
		    exit();

        

    }
    // si on ne trouve aucune réponse, le visiteur s'est trompé soit dans son login, soit dans son mot de passe
    elseif ($data[0] == 0) {
        $erreur = 'Compte non reconnu.';
    }
    // sinon, alors la, il y a un gros problème 🙂
    else {
        $erreur = 'Problème dans la base de données : plusieurs membres ont les mêmes identifiants de connexion.';
    }
    }
    else {
    $erreur = 'Au moins un des champs est vide.';
    }
}
?>

Formulaire de connexion (sur la même page)

<div id="logon">
<?php
if (isset($erreur)) echo '<div class="erreurindex">'.$erreur.'</div>';
?>
    <form action="index.php" method="post">

        <div id="login">
        Login:</br>
        <input type="text" name="login" value="<?php if (isset($_POST['login'])) echo htmlentities(trim($_POST['login'])); ?>"/>
        </div>

        <div id="mdp">
        Password:</br>
        <input type="password" name="pass" value="<?php if (isset($_POST['pass'])) echo htmlentities(trim($_POST['pass'])); ?>"/>
        </div>
    <input type="submit" name="connexion" value="Connexion">
    </form> 
    
    
</div>

Protéger les pages demandant d’être authentifié

Code de la page main.php, c’est la page du site devant être protégé. Ce code est a ajouter sur toutes les pages du site affichant des données (sauf index.php bien evidemment)
Verifie qu’une session est bien ouverte sinon on est redirigé vers la page d’authentification.

<?php
session_start();
if (!isset($_SESSION['login'])) {
	header ('Location: index.php');
	exit();
}?>

On peut aussi faire un bouton « Déconnexion » n’importe où sur le site qui pointe sur cette page

<a href="disconnect.php">Déconnexion</a>

Se déconnecter

Code de la page disconnect.php, un appel a cette page nous déconnecte du site et redirige vers l’authentification

    <?php
    session_start();
    session_unset();
    session_destroy();
    header('Location: index.php');
    exit();
    ?>

Changer son mot de passe

Code de la page membre.php, qui permet de changer son mot de passe une fois connecté

<?php
 
// on teste si le visiteur a soumis le formulaire
if ((isset($_POST['pass'])) && (isset($_POST['pass_confirm'])) ){    
      // on teste l'existence de nos variables. On teste également si elles ne sont pas vides
      if ((isset($_POST['pass']) && !empty($_POST['pass_confirm'])) ) {
      // on teste les deux mots de passe
         if ($_POST['pass'] != $_POST['pass_confirm']) {
            $erreur = 'Les 2 mots de passe sont différents.';
      }
      else {
         include 'connect.php';
      $login=$_SESSION['login'];
         $pass_md5=md5($_POST['pass']);
         $sql = "UPDATE votre_table SET password='$pass_md5' WHERE login='$login'";
         mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());
 
          // redirection vers la page principale
         header('Location: main.php');
          
          
          
          
      }
      }
      else {
      $erreur = 'Au moins un des champs est vide.';
      }
  }
 
?>

formulaire de changement du mot de passe (sur la même page)

<?php if (isset($erreur)) {echo '<div class="erreurindex">'.$erreur.'</div>';} ?>
<form action="membre.php" method="post">
Changer de mot de passe : <br /><input type="password" name="pass" value=""><br />
Confirmation du mot de passe : <br /><input type="password" name="pass_confirm" value=""></p>
<input type="submit" name="membre" value="Changer le mot de passe">
</form>

Ajouter un utilisateur

Code le la page user.php pour ajouter un utilisateur

    <?php
    
		
	// on teste si le visiteur a soumis le formulaire
    if (isset($_POST['inscription']) && $_POST['inscription'] == 'Ajouter') {
    	// on teste l'existence de nos variables. On teste également si elles ne sont pas vides
    	if ((isset($_POST['login']) && !empty($_POST['login'])) && (isset($_POST['pass']) && !empty($_POST['pass'])) ) {
    	// on teste les deux mots de passe
    	//if ($_POST['pass'] != $_POST['pass_confirm']) {
    	//	$erreur = 'Les 2 mots de passe sont différents.';
    	//}
    	//else {
    		include 'connect.php';

    		// on recherche si ce login est déjà utilisé par un autre membre
    		$sql = 'SELECT count(*) FROM votre_table WHERE login="'.mysql_escape_string($_POST['login']).'"';
    		$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
    		$data = mysql_fetch_array($req);

    		if ($data[0] == 0) {
    		$sql = 'INSERT INTO votre_table VALUES("", "'.mysql_escape_string($_POST['login']).'", "'.mysql_escape_string(md5($_POST['pass'])).'","'.mysql_escape_string($_POST['niveauacces']).'","'.mysql_escape_string($_POST['prenom']).'","'.mysql_escape_string($_POST['nom']).'","'.mysql_escape_string($_POST['resetpwd']).'")';
    		mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());

    		//quand ok, redirection vers la page principale
    		header('Location: main.php');
    		
    		}
    		else {
    		$erreur = 'Le compte existe d&eacute;j&agrave;.';
    		}
    	//}
    	}
    	else {
    	$erreur = 'Au moins un des champs requis est vide.';
    	}
    }
    ?>

formulaire d’ajout d’un utilisateur (sur la même page)

<form action="inscription.php" method="post">
	Nom</br><input type="text" name="nom" value=""><br />
	Pr&eacute;nom</br><input type="text" name="prenom" value=""><br />
    Login *<br /><input type="text" name="login" value="<?php if (isset($_POST['login'])) echo htmlentities(trim($_POST['login'])); ?>"><br />
    Mot de passe *<br /><input type="password" name="pass" value="<?php if (isset($_POST['pass'])) echo htmlentities(trim($_POST['pass'])); ?>"><br />
    <input type="submit" name="inscription" value="Ajouter">
</form>

Laissez un commentaire