Eine Metin2 Ranking-Seite ist eine kleine, aber leistungsstarke Webanwendung, die Spieler- und Gildendaten aus der Datenbank deines Servers liest und Besuchern als geordnete Tabellen anzeigt. Auf diesen Seiten sehen Spieler ihr eigenes Level, die Position ihrer Gilde und ihre PvP-Statistiken; sie halten die Community lebendig, fördern den Wettbewerb und verleihen deinem Server eine professionelle Note. In diesem Artikel zeige ich Schritt für Schritt, wie man mit PHP und MySQL eine sichere und performante Ranking-Seite von Grund auf aufbaut.
Die Metin2-Datenbankstruktur verstehen
Metin2-Server verteilen ihre Daten auf mehrere MySQL-Datenbanken: Spielerinformationen liegen meist in der player-Datenbank, während Accounts in der account-Datenbank liegen. Für eine Ranking-Seite interessieren uns die beiden folgenden Tabellen:
player.player— enthältname,level,exp,playtime,job(Klasse) undguild_idjedes Charakters.player.guild— speichert den Gildennamen (name), daslevel, dieexpund die Gildenkrieg-Ergebnisse (win,draw,loss).
Ein wichtiger Hinweis: Eine Ranking-Seite darf die Tabellen, in die der Spielserver schreibt, niemals verändern. Der sicherste Ansatz ist, einen schreibgeschützten MySQL-Benutzer anzulegen, der nur SELECT-Abfragen ausführen darf.
CREATE USER 'ranking'@'localhost' IDENTIFIED BY 'ein_starkes_passwort';
GRANT SELECT ON player.player TO 'ranking'@'localhost';
GRANT SELECT ON player.guild TO 'ranking'@'localhost';
FLUSH PRIVILEGES;
Eine sichere Datenbankverbindung (PDO)
Der moderne, sichere Weg, sich in PHP mit MySQL zu verbinden, ist PDO. Dank Prepared Statements sind wir gegen SQL-Injection geschützt. Die Verbindung in einer einzigen Datei zu bündeln, erleichtert die spätere Verwaltung:
<?php
// db.php
$host = '127.0.0.1';
$db = 'player';
$user = 'ranking';
$pass = 'ein_starkes_passwort';
$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('Verbindung zur Datenbank fehlgeschlagen.');
}
Statt das Datenbankpasswort fest in den Quellcode zu schreiben, ist es sicherer, es in der Produktion aus einer .env-Datei oder einer Umgebungsvariable des Servers zu lesen.
Die Spielerrangliste abrufen
Die klassischste Tabelle einer Metin2 Ranking-Seite sortiert Spieler nach Level und Erfahrung. Um den echten Fortschritt eines Charakters zu ranken, sortieren wir zuerst nach level und bei Gleichstand nach exp:
<?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();
50 Zeilen pro Seite anzuzeigen ist sowohl lesbar als auch performant. Wenn du mehr zeigen möchtest, denke über eine Paginierung nach.
Die Daten in einer HTML-Tabelle anzeigen
Jeder Text, der aus der Datenbank kommt, muss vor der Ausgabe mit htmlspecialchars() maskiert werden; andernfalls könnten Spielernamen mit Sonderzeichen eine XSS-Lücke öffnen. Die Spalte playtime wird in Minuten gespeichert, daher rechnen wir sie zur besseren Lesbarkeit in Stunden um:
<table>
<thead>
<tr><th>#</th><th>Name</th><th>Level</th><th>Zeit</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) ?> Std</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
Eine Gildenrangliste hinzufügen
Eine Gildenrangliste neben der Spielertabelle stärkt den Wettbewerb in der Community. Wir können Gilden nach Level und der Anzahl gewonnener Gildenkriege sortieren:
<?php
$stmt = $pdo->query(
"SELECT name, level, win, draw, loss
FROM guild
ORDER BY level DESC, win DESC
LIMIT 20"
);
$guilds = $stmt->fetchAll();
Du kannst auch die Tabellen player und guild über guild_id verbinden, um zusätzliche Tabellen wie "die bevölkerungsreichsten Gilden" zu erzeugen.
Paginierung und Suche hinzufügen
Je größer dein Server wird, desto weniger sollen sich Spieler nur mit den Top 50 begnügen; jeder ist auf seinen eigenen Rang gespannt. Deshalb machen Paginierung und eine einfache Namenssuche die Ranking-Seite deutlich nützlicher. Wir lesen die Seitennummer aus der URL und casten sie weiterhin, um alles sicher zu halten:
<?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();
Setze bei der Namenssuche die Eingabe des Benutzers niemals direkt in die Abfrage; verwende LIKE in einem Prepared Statement und binde sie als Parameter. Das ist sicher und lässt Spieler ihre eigenen Charaktere schnell finden.
Die Seite an das Theme deines Servers anpassen
Die Präsentation zählt genauso viel wie das technische Fundament. Eine Ranking-Seite wirkt professionell, wenn sie dieselbe Farbpalette, Schriftart und Logo-Sprache wie die Hauptseite des Servers verwendet. Die Top drei mit Gold-/Silber-/Bronze-Farben hervorzuheben, Gildenembleme zu zeigen und eine mobilfreundliche Tabelle zu gestalten, verbessern das Besuchererlebnis spürbar. Die Tabelle auf kleinen Bildschirmen in einen horizontal scrollbaren Container zu packen, verhindert ein Überlaufen.
Performance und Caching
Für jeden Besucher eine Live-Abfrage auszuführen, belastet die Datenbank, je größer die Spielerzahl wird. Da sich Ranglisten nicht im Sekundentakt ändern, ist es sehr sinnvoll, die Ergebnisse kurz zu cachen:
- Speichere das Abfrageergebnis einige Minuten lang in einer Datei oder einem Redis-Cache und aktualisiere es nach Ablauf.
- Stelle sicher, dass die Sortierspalten (
level,exp) einen MySQL-Index haben. - Betreibe die Ranking-Seite getrennt von der Maschine des Spielservers und verbinde dich nur mit dem schreibgeschützten Benutzer.
Häufige Fragen
Verlangsamt die Ranking-Seite den Spielserver?
Nicht bei korrekter Einrichtung. Mit einem schreibgeschützten Benutzer, indexierten Abfragen und ein paar Minuten Caching bleibt die Datenbanklast vernachlässigbar.
Warum werden Sonderzeichen in Spielernamen falsch dargestellt?
Meist ist es ein Zeichensatz-Konflikt. Stelle sicher, dass du in der PDO-Verbindung charset=utf8mb4 verwendest und deine HTML-Seite <meta charset="utf-8"> enthält.
Nach welchen Feldern sollte ich ranken?
Die häufigsten Optionen sind Level + Erfahrung, Gildenlevel und PvP-/Kill-Statistiken. Je nach Servertyp können auch Felder wie Spielzeit oder Gold interessant sein.
Möchtest du eine professionelle Ranking-Seite für deinen Server? Mit PHP und MySQL entwerfe und baue ich sichere, schnelle Ranglisten-Seiten, die zum Thema deines Servers passen. Kontaktiere mich, um über dein Projekt zu sprechen.