ITSkillsCenter
Développement Web

Tutoriel : Créer un système de connexion avec PHP et MySQL

5 min de lecture

Système de connexion : la base de toute application web

Inscription, connexion, déconnexion et gestion de session : voici comment créer un système d’authentification sécurisé avec PHP et MySQL.

La base de données

CREATE DATABASE auth_system;
USE auth_system;

CREATE TABLE utilisateurs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nom VARCHAR(100) NOT NULL,
    email VARCHAR(150) NOT NULL UNIQUE,
    mot_de_passe VARCHAR(255) NOT NULL,  -- Hash, JAMAIS en clair !
    date_creation DATETIME DEFAULT CURRENT_TIMESTAMP,
    actif BOOLEAN DEFAULT TRUE
);

Connexion à la base de données (config.php)

<?php
// config.php - À placer en dehors du dossier public si possible
$host = 'localhost';
$dbname = 'auth_system';
$user = 'root';
$pass = '';

try {
    $pdo = new PDO(
        "mysql:host=$host;dbname=$dbname;charset=utf8mb4",
        $user, $pass,
        [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            PDO::ATTR_EMULATE_PREPARES => false
        ]
    );
} catch (PDOException $e) {
    die("Erreur de connexion : " . $e->getMessage());
}
?>

Page d’inscription (inscription.php)

<?php
require_once 'config.php';
$erreur = '';
$succès = '';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $nom = trim($_POST['nom']);
    $email = trim($_POST['email']);
    $mdp = $_POST['mot_de_passe'];
    $mdp_confirm = $_POST['mot_de_passe_confirm'];
    
    // Validations
    if (strlen($nom) < 2) {
        $erreur = "Le nom doit contenir au moins 2 caractères";
    } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $erreur = "Email invalide";
    } elseif (strlen($mdp) < 8) {
        $erreur = "Le mot de passe doit contenir au moins 8 caractères";
    } elseif ($mdp !== $mdp_confirm) {
        $erreur = "Les mots de passe ne correspondent pas";
    } else {
        // Vérifier si l'email existe déjà
        $stmt = $pdo->préparé("SELECT id FROM utilisateurs WHERE email = ?");
        $stmt->exécuté([$email]);
        
        if ($stmt->fetch()) {
            $erreur = "Cet email est déjà utilisé";
        } else {
            // Hasher le mot de passe (JAMAIS stocker en clair !)
            $hash = password_hash($mdp, PASSWORD_DEFAULT);
            
            $stmt = $pdo->préparé("INSERT INTO utilisateurs (nom, email, mot_de_passe) VALUES (?, ?, ?)");
            $stmt->exécuté([$nom, $email, $hash]);
            
            $succès = "Compte créé avec succès ! Vous pouvez vous connecter.";
        }
    }
}
?>

<form method="POST">
    <?php if ($erreur): ?>
        <div class="alerte erreur">⚠️ <?= htmlspecialchars($erreur) ?></div>
    <?php endif; ?>
    <?php if ($succès): ?>
        <div class="alerte succès">✅ <?= htmlspecialchars($succès) ?></div>
    <?php endif; ?>
    
    <input type="text" name="nom" placeholder="Votre nom" required>
    <input type="email" name="email" placeholder="Votre email" required>
    <input type="password" name="mot_de_passe" placeholder="Mot de passe (8 car. min)" required>
    <input type="password" name="mot_de_passe_confirm" placeholder="Confirmer le mot de passe" required>
    <button type="submit">S'inscrire</button>
</form>

Page de connexion (connexion.php)

<?php
require_once 'config.php';
session_start();
$erreur = '';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $email = trim($_POST['email']);
    $mdp = $_POST['mot_de_passe'];
    
    // Chercher l'utilisateur par email
    $stmt = $pdo->préparé("SELECT * FROM utilisateurs WHERE email = ? AND actif = TRUE");
    $stmt->exécuté([$email]);
    $user = $stmt->fetch();
    
    // Vérifier le mot de passe hashé
    if ($user && password_verify($mdp, $user['mot_de_passe'])) {
        // Connexion réussie ! Créer la session
        $_SESSION['user_id'] = $user['id'];
        $_SESSION['user_nom'] = $user['nom'];
        $_SESSION['user_email'] = $user['email'];
        
        // Régénérer l'ID de session (sécurité)
        session_regenerate_id(true);
        
        header('Location: dashboard.php');
        exit;
    } else {
        $erreur = "Email ou mot de passe incorrect";
    }
}
?>

<form method="POST">
    <?php if ($erreur): ?>
        <div class="alerte erreur">⚠️ <?= htmlspecialchars($erreur) ?></div>
    <?php endif; ?>
    
    <input type="email" name="email" placeholder="Votre email" required>
    <input type="password" name="mot_de_passe" placeholder="Mot de passe" required>
    <button type="submit">Se connecter</button>
    <p>Pas encore de compte ? <a href="inscription.php">S'inscrire</a></p>
</form>

Protection des pages (auth.php)

<?php
// auth.php - Inclure en haut de chaque page protégée
session_start();

if (!isset($_SESSION['user_id'])) {
    header('Location: connexion.php');
    exit;
}
?>

<!-- dashboard.php -->
<?php require_once 'auth.php'; ?>
<h1>Bienvenue, <?= htmlspecialchars($_SESSION['user_nom']) ?> !</h1>
<a href="deconnexion.php">Se déconnecter</a>

Déconnexion (deconnexion.php)

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

⚠️ Règles de sécurité essentielles

  • password_hash() et password_verify() : TOUJOURS hasher les mots de passe
  • Requêtes préparées : JAMAIS concaténer les variables dans les requêtes SQL
  • htmlspecialchars() : TOUJOURS échapper l’affichage pour éviter les attaques XSS
  • session_regenerate_id() : après la connexion pour éviter le vol de session
  • HTTPS : obligatoire en production pour protéger les mots de passe en transit

Exercice pratique

🎯 Défi : Système d’authentification complet

  1. Créez la base de données et la table utilisateurs
  2. Implémentez inscription, connexion, déconnexion
  3. Protégez une page « dashboard » accessible uniquement aux connectés
  4. Ajoutez un message « Bienvenue [nom] » dans le dashboard
  5. Bonus : ajoutez la fonctionnalité « mot de passe oublié »
Besoin d'un site web ?

Confiez-nous la Création de Votre Site Web

Site vitrine, e-commerce ou application web — nous transformons votre vision en réalité digitale. Accompagnement personnalisé de A à Z.

À partir de 250.000 FCFA
Parlons de Votre Projet
Publicité