aslain.dev
0%
01 Hizmetler 02 Hakkımda 03 Projeler 04 Stack 05 Blog 06 İletişim
← Tüm makaleler Metin2

Créer un site de classement Metin2 (PHP + MySQL)

Un site de classement Metin2 est une petite application web, mais puissante, qui récupère les données des joueurs et des guildes dans la base de données de votre serveur et les présente aux visiteurs sous forme de tableaux ordonnés. Ces pages permettent aux joueurs de voir leur niveau, le rang de leur guilde et leurs statistiques PvP ; elles maintiennent la communauté active, nourrissent la compétition et donnent une image professionnelle à votre serveur. Dans cet article, j'explique pas à pas comment construire une page de classement sécurisée et performante à partir de zéro avec PHP et MySQL.

Comprendre la structure de la base de données Metin2

Les serveurs Metin2 répartissent leurs données dans plusieurs bases MySQL : les informations des joueurs se trouvent généralement dans la base player, tandis que les comptes sont dans la base account. Pour un site de classement, les deux tables qui nous intéressent sont :

  • player.player — contient le name, le level, l'exp, le playtime, le job (classe) et le guild_id de chaque personnage.
  • player.guild — stocke le nom de la guilde (name), son level, son exp et les résultats des guerres de guilde (win, draw, loss).

Un point important : un site de classement ne doit jamais modifier les tables dans lesquelles écrit le serveur de jeu. L'approche la plus sûre consiste à créer un utilisateur MySQL en lecture seule qui ne peut exécuter que des requêtes SELECT.

CREATE USER 'ranking'@'localhost' IDENTIFIED BY 'un_mot_de_passe_fort';
GRANT SELECT ON player.player TO 'ranking'@'localhost';
GRANT SELECT ON player.guild TO 'ranking'@'localhost';
FLUSH PRIVILEGES;

Une connexion à la base de données sécurisée (PDO)

La manière moderne et sûre de se connecter à MySQL en PHP est PDO. Grâce aux requêtes préparées, nous sommes protégés contre l'injection SQL. Regrouper la connexion dans un seul fichier facilite la gestion ultérieure :

<?php
// db.php
$host = '127.0.0.1';
$db   = 'player';
$user = 'ranking';
$pass = 'un_mot_de_passe_fort';

$dsn = "mysql:host=$host;dbname=$db;charset=utf8mb4";
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];

try {
    $pdo = new PDO($dsn, $user, $pass, $options);
} catch (PDOException $e) {
    http_response_code(500);
    exit('Impossible de se connecter à la base de données.');
}

Plutôt que de coder en dur le mot de passe dans votre source, il est plus sûr de le lire depuis un fichier .env ou une variable d'environnement du serveur en production.

Récupérer le classement des joueurs

Le tableau le plus classique d'un site de classement Metin2 trie les joueurs par niveau et expérience. Pour classer la vraie progression d'un personnage, on trie d'abord par level, puis par exp en cas d'égalité :

<?php
$stmt = $pdo->prepare(
    "SELECT name, level, exp, playtime
     FROM player
     ORDER BY level DESC, exp DESC
     LIMIT :limit"
);
$stmt->bindValue(':limit', 50, PDO::PARAM_INT);
$stmt->execute();
$players = $stmt->fetchAll();

Afficher 50 lignes par page est à la fois lisible et performant. Si vous voulez en montrer davantage, pensez à ajouter une pagination.

Afficher les données dans un tableau HTML

Chaque texte provenant de la base de données doit être échappé avec htmlspecialchars() avant d'atteindre la page ; sinon, des noms de joueurs avec des caractères spéciaux pourraient ouvrir une faille XSS. La colonne playtime est stockée en minutes, nous la convertissons en heures pour plus de lisibilité :

<table>
  <thead>
    <tr><th>#</th><th>Nom</th><th>Niveau</th><th>Temps</th></tr>
  </thead>
  <tbody>
  <?php foreach ($players as $i => $p): ?>
    <tr>
      <td><?= $i + 1 ?></td>
      <td><?= htmlspecialchars($p['name']) ?></td>
      <td><?= (int) $p['level'] ?></td>
      <td><?= round($p['playtime'] / 60) ?> h</td>
    </tr>
  <?php endforeach; ?>
  </tbody>
</table>

Ajouter un classement des guildes

Placer un classement des guildes à côté du tableau des joueurs renforce la compétition communautaire. On peut trier les guildes par niveau et par nombre de guerres de guilde gagnées :

<?php
$stmt = $pdo->query(
    "SELECT name, level, win, draw, loss
     FROM guild
     ORDER BY level DESC, win DESC
     LIMIT 20"
);
$guilds = $stmt->fetchAll();

Vous pouvez aussi joindre les tables player et guild via guild_id pour produire des tableaux supplémentaires comme « les guildes les plus peuplées ».

Ajouter la pagination et la recherche

À mesure que votre serveur grandit, vous ne voulez pas que les joueurs se contentent du top 50 ; chacun veut connaître son propre rang. C'est pourquoi la pagination et une simple recherche par nom rendent le site de classement bien plus utile. Nous lisons le numéro de page depuis l'URL tout en le convertissant pour rester sûr :

<?php
$page    = max(1, (int) ($_GET['page'] ?? 1));
$perPage = 50;
$offset  = ($page - 1) * $perPage;

$stmt = $pdo->prepare(
    "SELECT name, level, exp
     FROM player
     ORDER BY level DESC, exp DESC
     LIMIT :limit OFFSET :offset"
);
$stmt->bindValue(':limit', $perPage, PDO::PARAM_INT);
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->execute();

Pour la recherche par nom, ne placez jamais la saisie de l'utilisateur directement dans la requête ; utilisez LIKE dans une requête préparée et liez-la comme paramètre. C'est à la fois sûr et cela permet aux joueurs de retrouver rapidement leurs propres personnages.

Adapter la page au thème de votre serveur

La présentation compte autant que la base technique. Une page de classement paraît professionnelle lorsqu'elle utilise la même palette de couleurs, la même police et le même langage de logo que le site principal du serveur. Mettre en valeur les trois premiers avec des couleurs or/argent/bronze, afficher les emblèmes de guilde et concevoir un tableau adapté au mobile améliorent nettement l'expérience du visiteur. Englober le tableau dans un conteneur à défilement horizontal sur petits écrans évite le débordement.

Performance et mise en cache

Exécuter une requête en direct pour chaque visiteur sollicite la base à mesure que le nombre de joueurs augmente. Comme les classements ne changent pas à la seconde, mettre les résultats en cache pendant un court instant est tout à fait judicieux :

  • Stockez le résultat de la requête dans un fichier ou un cache Redis pendant quelques minutes, puis rafraîchissez-le à l'expiration.
  • Assurez-vous que les colonnes de tri (level, exp) disposent d'un index MySQL.
  • Hébergez le site de classement séparément de la machine du serveur de jeu et connectez-vous uniquement avec l'utilisateur en lecture seule.

Questions fréquentes

Le site de classement va-t-il ralentir le serveur de jeu ?

Pas s'il est bien configuré. Avec un utilisateur en lecture seule, des requêtes indexées et quelques minutes de cache, la charge sur la base reste négligeable.

Pourquoi les caractères spéciaux des noms de joueurs s'affichent-ils mal ?

C'est généralement un problème de jeu de caractères. Vérifiez que vous utilisez charset=utf8mb4 dans la connexion PDO et que votre page HTML contient <meta charset="utf-8">.

Selon quels champs dois-je classer ?

Les choix les plus courants sont niveau + expérience, niveau de guilde et statistiques PvP/kills. Selon le type de serveur, des champs comme le temps de jeu ou l'or peuvent aussi être intéressants.

Vous voulez un site de classement professionnel pour votre serveur ? Avec PHP et MySQL, je peux concevoir et construire des pages de classement sécurisées et rapides, en accord avec le thème de votre serveur. Contactez-moi pour parler de votre projet.

Bu kategorideki tüm yazılar →

Devamı için