← Projets

Refonte et Optimisation du Site de Gestion des Vœux M1

Sorbonne UniversitéGénie Logiciel et Gestion de Projet (GPSTL)Nov. 2024 — Août 2025

Modernisation du site de gestion des vœux UE du Master 1 informatique de Sorbonne Université — un système PHP/MySQL vieillissant, non sécurisé et peu maintenable. Le projet couvre la migration vers PDO, la refonte du système d'envoi d'e-mails, la génération PDF, un dashboard administrateur centralisé, et un système de traduction dynamique FR/EN. Les performances ont été multipliées par 5,4 (tests Siege, 100 utilisateurs simultanés, 5 minutes).

État initial — problèmes identifiés

L'analyse de l'existant a mis en évidence quatre catégories de problèmes :

  • Sécurité — requêtes MySQL non préparées (risque d'injection SQL), sessions basiques, absence de validation avancée côté serveur.
  • Obsolescence API — usage de mysql_connect() et mysql_query() retirées depuis PHP 7 ; jQuery 2014 (jquery-latest.js), Bootstrap 3.3.4.
  • Qualité du code — logique métier, présentation et requêtes SQL mélangées dans les mêmes fichiers PHP ; die(mysql_error()) exposé en production.
  • Données — soumissions multiples d'un même étudiant créaient des doublons en base ; redondances de tables ; renommage des masters non répercuté (ANDROIDE → AI2D, DAC → MIND, IQ → QI).

Migration vers PDO

Remplacement complet de l'extension mysql_* par PDO avec requêtes préparées. Avant la migration, une requête typique construisait la clause WHERE par concaténation directe de la variable $id — vecteur d'injection classique. Après migration :

$pdo = new PDO("mysql:host=$server;dbname=$database;charset=utf8", $user, $password, [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]);
$stmt = $pdo->prepare("SELECT nom FROM etudiants WHERE num_etudiant = :id LIMIT 1");
$stmt->execute(['id' => $id]);
$row = $stmt->fetch();

L'ajout de LIMIT 1 supprime les itérations inutiles sur les résultats. Les blocs try/catch PDOException remplacent les die(), les erreurs étant journalisées via error_log() sans exposition en production. Des contraintes d'intégrité ont également été ajoutées : UNIQUE(num_etudiant, ue) pour éliminer la redondance des vœux, et des index sur num_etudiant pour accélérer les jointures.

Gestion des doublons et validation des vœux

L'ancien formulaire créait une nouvelle ligne à chaque soumission. La nouvelle logique vérifie d'abord l'existence d'une entrée pour l'étudiant : si elle existe, un UPDATE est effectué plutôt qu'un INSERT, le tout enveloppé dans une transaction SQL. Une validation côté serveur empêche l'enregistrement d'UE laissées à la valeur par défaut («--- Choisissez une UE---»).

Refonte du système de mailing — PHPMailer

La fonction native mail() a été remplacée par PHPMailer avec SMTP sécurisé (SSL/TLS, port 465). La configuration est externalisée dans config_mail.php(hors dépôt) — credentials non exposés dans le code. Le bloc try/catchcapture les erreurs d'envoi et les enregistre dans les logs. Avantages : support SSL/TLS, authentification SMTP, validation des adresses avant envoi, suppression des dépendances au sendmail local.

Dashboard administrateur

Deux fonctions d'administration ont été centralisées dans une interface web dédiée :

  • Gestion du mode ouvert/fermé — un toggle switch appelle set_mode.php via fetch() POST et écrit dans un fichier mode.txt. Le script index.php inclut dynamiquement index_site_ouvert.php ou index_site_ferme.php selon le contenu du fichier. L'administrateur n'a plus à modifier manuellement le code.
  • Gestion du calendrier des emplois du temps — les données, auparavant codées en dur dans calendrier.js (variable listeUE), sont désormais stockées en base et mises à jour via upload d'un fichier CSV. La fonction getCalendrier() fetch get_data.php de manière asynchrone et reconstruit les créneaux selon le semestre actif.

Système de traduction FR/EN

Un sélecteur de langue a été ajouté via un fichier translations.js contenant un dictionnaire FR/EN. Les éléments du DOM portent un attribut data-translate-key ; la fonction changeLanguage() parcourt tous ces éléments et met à jour le contenu textuel (ou la propriété valuepour les boutons input[type=submit]).

Performances — résultats Siege

Tests Siege sur 100 utilisateurs simultanés pendant 5 minutes (-c100 -t5m, mode benchmark) sur AMD Ryzen 7 5700U, 16 Go RAM :

IndicateurAvantAprèsGain
Transactions totales16 52789 215×5,4
Temps de réponse moyen1,61 s0,30 s−81 %
Transactions/sec61,22331,40×5,4
Disponibilité99,99 %100 %+0,01 %
Taux d'erreurs20−100 %

Flux de navigation

Le processus de soumission des vœux suit sept étapes : accès via index.php → redirection vers start_session.php → vérification/création de l'entrée en base → envoi du code de vérification par e-mail (send_id.php) → saisie du code (saisie_identifiant.php) → sélection des UE (choix_ues.php) → génération PDF de confirmation et insertion en base (genererMailPDF.php).

Schéma récapitulatif des flux de navigation et des interactions
×5,4débit — 16 527 → 89 215 transactions (Siege)
−81 %temps de réponse — 1,61 s → 0,30 s
0 erreurtaux d'erreur SQL après migration PDO

Stack

PHPPHP
PDOPDO
MySQLMySQL
PHPMailerPHPMailer
FPDF
jQuery
JavaScriptJavaScript

Équipe

Abdelkader BoumessaoudSorbonne Universitéabdelkader.boumessaoud.pro@gmail.com
Yok Yann HuynhSorbonne Université
Waly FallSorbonne Université
Haotian XueSorbonne Université

Encadrant

Antoine Genitrini

Maître de conférences — Sorbonne Université / LIP6