Enregistrement du score
Enregistrer le score du joueur dans Supabase, afin de pouvoir afficher un classement.

Notions théoriques
Pourquoi faut-il enregistrer le score dans la base de données ?
Enregistrer le score permet de :
- Garder une trace des performances d’un joueur
- Afficher un classement ou des records
- Motiver les joueurs à s’améliorer
- Reprendre un quiz plus tard ou comparer ses résultats
Où enregistrer les scores ?
Il existe 2 façons d’enregistrer les scores dans la base de données.

1. La méthode complète (prévue dans le MCD)
Dans le modèle de données initial (le MCD), nous avions prévu 2 tables distinctes pour gérer les scores :
| Table | Rôle |
|---|---|
classement | Contient un score, un temps, une date — c’est une partie jouée |
classement_joueur | Fait le lien entre un joueur et une partie (clé étrangère) |
Avantages :
- Permet de stocker plusieurs parties par joueur (historique complet)
- Possibilité de faire un classement général avec tous les joueurs
- Structure souple et scalable pour une vraie application multi-joueurs
Inconvénients :
- Il faut gérer plusieurs tables
- Il faut faire des jointures entre les tables
- Il faut gérer les droits d’accès (RLS) pour sécuriser les données
2. La méthode simplifiée (utilisée dans le TP)
Pour ce TP, nous allons simplifier les choses au maximum :
On va enregistrer le meilleur score directement dans la table joueur.
On ajoute simplement 3 colonnes :
| Colonne | Type | Description |
|---|---|---|
meilleur_score | bigint | Le meilleur score obtenu par le joueur |
meilleur_temps | bigint | Le temps (en secondes) associé à ce score |
date_meilleur_score | date | La date à laquelle ce score a été réalisé |
Avantages :
- Une seule table à gérer : plus rapide à mettre en place
- Pas besoin de jointures ni de requêtes complexes
- Pas besoin de règles de sécurité compliquées (RLS)
Limites :
- On ne garde qu’un seul score par joueur (le meilleur)
- On ne peut pas afficher l’historique des parties
Dans le TP, nous allons :
- Ajouter quelques colonnes à la table
joueur - Enregistrer le meilleur score, le temps associé et la date dans la table
joueur - Abandonner les tables
classementetclassement_joueur
Cela vous permettra de réussir rapidement un enregistrement de score fonctionnel, sans vous perdre dans la complexité des bases relationnelles.
Comment mesurer le temps ?
On mesure le temps que met un joueur pour répondre à toutes les questions :
const debut = Date.now(); // au début du quiz
Puis à la fin :
const tempsTotal = Math.floor((Date.now() - debut) / 1000); // en secondes
Comment enregistrer le meilleur score ?
À la fin du quiz, on compare le score actuel avec le meilleur_score déjà enregistré dans la base.
S’il est meilleur, on met à jour la ligne du joueur :
await supabase
.from("joueur")
.update({
meilleur_score: score,
meilleur_temps: tempsTotal,
date_meilleur_score: new Date().toISOString().split("T")[0],
})
.eq("user_id", userId); // on identifie le joueur
Exemple pratique
Voici un exemple de code exécuté à la fin du quiz, pour mettre à jour le meilleur score :
async function enregistrerMeilleurScore() {
const userId = localStorage.getItem("supabase_user_id");
if (!userId || debut === null || questions.length === 0) return;
const tempsTotal = Math.floor((Date.now() - debut) / 1000);
const aujourdHui = new Date().toISOString().split("T")[0];
// Récupérer l'ancien meilleur score
const { data: joueur, error } = await supabase
.from("joueur")
.select("meilleur_score")
.eq("user_id", userId)
.single();
if (error || !joueur) {
console.error("Erreur récupération joueur :", error);
return;
}
const ancienMeilleur = joueur.meilleur_score || 0;
// Mise à jour uniquement si le score est meilleur
if (score > ancienMeilleur) {
await supabase
.from("joueur")
.update({
meilleur_score: score,
meilleur_temps: tempsTotal,
date_meilleur_score: aujourdHui,
})
.eq("user_id", userId);
}
}
Quelques méthodes à connaître
| Méthode JavaScript | Utilité |
|---|---|
Date.now() | Renvoie l’heure actuelle en millisecondes |
Math.floor() | Arrondit à l’entier inférieur |
new Date().toISOString() | Renvoie la date/heure actuelle au format ISO |
.split("T")[0] | Garde uniquement la date sans l’heure |
await supabase.from(...).update(...) | Met à jour une ligne dans la base de données |
.eq("user_id", userId) | Filtre pour mettre à jour le bon joueur |