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()etmysql_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.phpviafetch()POST et écrit dans un fichiermode.txt. Le scriptindex.phpinclut dynamiquementindex_site_ouvert.phpouindex_site_ferme.phpselon 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(variablelisteUE), sont désormais stockées en base et mises à jour via upload d'un fichier CSV. La fonctiongetCalendrier()fetchget_data.phpde 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 :
| Indicateur | Avant | Après | Gain |
|---|---|---|---|
| Transactions totales | 16 527 | 89 215 | ×5,4 |
| Temps de réponse moyen | 1,61 s | 0,30 s | −81 % |
| Transactions/sec | 61,22 | 331,40 | ×5,4 |
| Disponibilité | 99,99 % | 100 % | +0,01 % |
| Taux d'erreurs | 2 | 0 | −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).
