PHP LogoGame Scoreboard

A Game Scoreboard is a fundamental feature in many games that tracks and displays the performance of players, typically showing high scores. It serves as a motivation for players to improve their skills and compete against others, fostering a sense of achievement and rivalry.\n\nKey components and functionalities of a game scoreboard often include:\n\n1. Player Name: The identifier for the player who achieved the score.\n2. Score: The numerical value representing the player's performance (e.g., points, time taken, levels completed).\n3. Date/Time: When the score was achieved, providing context and allowing for chronological sorting.\n4. Sorting: The ability to sort scores, most commonly by score (highest first for points, lowest first for time) and sometimes by date.\n5. Persistence: Scores need to be stored permanently so they are not lost when the game or application closes. Common methods include:\n * Flat Files: Simple text files (CSV, JSON) for basic implementations.\n * Databases: Relational databases (MySQL, PostgreSQL, SQLite) or NoSQL databases are preferred for robustness, scalability, and complex queries.\n * Cloud Services/APIs: For online games, scores might be stored and managed by dedicated game services or custom APIs.\n6. Display: Presenting the scores in an organized and readable format, often a ranked list.\n7. Adding New Scores: A mechanism to submit new scores to the scoreboard, usually after a game session ends.\n8. Limiting Entries: Many scoreboards only display the top N scores or purge old entries to keep the list relevant.\n\nImplementation Considerations (PHP Example context):\n\nFor a web-based game or application using PHP, a common approach involves:\n* HTML Form: To submit player names and scores.\n* PHP Script: To process the form data, validate it, and interact with a database.\n* Database (e.g., MySQL): To store the scoreboard data (player_name, score, timestamp).\n* PHP & HTML: To fetch and display the scores from the database.\n\nThe example code will demonstrate how to set up a simple scoreboard that allows users to submit scores and view the top scores, using PHP and a MySQL database (via PDO for better practice).

Example Code

<!-- Database Setup (MySQL): -->
<!--
CREATE TABLE scores (
    id INT AUTO_INCREMENT PRIMARY KEY,
    player_name VARCHAR(255) NOT NULL,
    score INT NOT NULL,
    submission_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
-->

<?php
// 1. Database Configuration
$host = 'localhost';
$db = 'game_scoreboard'; // Replace with your database name
$user = 'root'; // Replace with your database user
$pass = ''; // Replace with your database password
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$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) {
    // In a real application, you might log the error and show a user-friendly message
    throw new \PDOException($e->getMessage(), (int)$e->getCode());
}

$message = '';

// 2. Handle Score Submission
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['player_name']) && isset($_POST['score'])) {
    $playerName = trim($_POST['player_name']);
    $score = (int)$_POST['score'];

    if (empty($playerName) || $score < 0) {
        $message = '<p style="color: red;">Player name cannot be empty and score must be a non-negative number.</p>';
    } else {
        try {
            $stmt = $pdo->prepare("INSERT INTO scores (player_name, score) VALUES (:player_name, :score)");
            $stmt->execute(['player_name' => $playerName, 'score' => $score]);
            $message = '<p style="color: green;">Score submitted successfully!</p>';
        } catch (\PDOException $e) {
            $message = '<p style="color: red;">Error submitting score: ' . $e->getMessage() . '</p>';
        }
    }
}

// 3. Fetch Scores for Display
$scores = [];
try {
    // Fetch top 10 scores, ordered by score descending, then by submission time ascending for ties
    $stmt = $pdo->query("SELECT player_name, score, submission_time FROM scores ORDER BY score DESC, submission_time ASC LIMIT 10");
    $scores = $stmt->fetchAll();
} catch (\PDOException $e) {
    $message .= '<p style="color: red;">Error fetching scores: ' . $e->getMessage() . '</p>';
}

?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Game Scoreboard</title>
    <style>
        body { font-family: Arial, sans-serif; margin: 20px; background-color: #f4f4f4; color: #333; }
        .container { max-width: 800px; margin: auto; background: #fff; padding: 20px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }
        h1, h2 { color: #0056b3; }
        form { margin-bottom: 30px; padding: 15px; border: 1px solid #ddd; border-radius: 5px; background-color: #f9f9f9; }
        form label { display: block; margin-bottom: 5px; font-weight: bold; }
        form input[type="text"], form input[type="number"] { width: calc(100% - 22px); padding: 10px; margin-bottom: 15px; border: 1px solid #ccc; border-radius: 4px; }
        form input[type="submit"] { background-color: #28a745; color: white; padding: 10px 20px; border: none; border-radius: 4px; cursor: pointer; font-size: 16px; }
        form input[type="submit"]:hover { background-color: #218838; }
        .message { margin-top: 10px; padding: 10px; border-radius: 5px; }
        .message p { margin: 0; }
        table { width: 100%; border-collapse: collapse; margin-top: 20px; }
        table th, table td { border: 1px solid #ddd; padding: 10px; text-align: left; }
        table th { background-color: #0056b3; color: white; }
        table tr:nth-child(even) { background-color: #f2f2f2; }
        table tr:hover { background-color: #ddd; }
    </style>
</head>
<body>
    <div class="container">
        <h1>Game Scoreboard</h1>

        <?php if (!empty($message)): ?>
            <div class="message"><?php echo $message; ?></div>
        <?php endif; ?>

        <h2>Submit Your Score</h2>
        <form method="POST">
            <label for="player_name">Player Name:</label>
            <input type="text" id="player_name" name="player_name" required maxlength="255">

            <label for="score">Score:</label>
            <input type="number" id="score" name="score" required min="0">

            <input type="submit" value="Submit Score">
        </form>

        <h2>Top Scores</h2>
        <?php if (empty($scores)): ?>
            <p>No scores submitted yet. Be the first!</p>
        <?php else: ?>
            <table>
                <thead>
                    <tr>
                        <th>Rank</th>
                        <th>Player Name</th>
                        <th>Score</th>
                        <th>Date Achieved</th>
                    </tr>
                </thead>
                <tbody>
                    <?php $rank = 1; foreach ($scores as $scoreEntry): ?>
                        <tr>
                            <td><?php echo $rank++; ?></td>
                            <td><?php echo htmlspecialchars($scoreEntry['player_name']); ?></td>
                            <td><?php echo htmlspecialchars($scoreEntry['score']); ?></td>
                            <td><?php echo date('Y-m-d H:i:s', strtotime($scoreEntry['submission_time'])); ?></td>
                        </tr>
                    <?php endforeach; ?>
                </tbody>
            </table>
        <?php endif; ?>
    </div>
</body>
</html>