Обработка таблицы рекордов на php

  1. <?php
  2.  
  3. $db_host = 'localhost:3307';
  4. $db_name = 'test';
  5. $db_user = 'root';
  6. $db_pass = '';
  7.  
  8. // Подключаемся к БД
  9. $pdo = new PDO("mysql:host=$db_host;dbname=$db_name;charset=utf8", $db_user, $db_pass, [
  10.     PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
  11. ]);
  12.  
  13. // Создаём таблицу результатов
  14. $pdo->exec('
  15.    CREATE TABLE IF NOT EXISTS `hiscore` (
  16.      `id` int(11) NOT NULL AUTO_INCREMENT,
  17.      `name` varchar(100) NOT NULL,
  18.      `score` int(11) NOT NULL,
  19.      `date` datetime NOT NULL,
  20.      PRIMARY KEY (`id`),
  21.      KEY `score` (`score`)
  22.    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  23. ');
  24.  
  25. $action = isset($_REQUEST['action']) ? $_REQUEST['action'] : '';
  26. switch ($action) {
  27.     case 'set':
  28.         // Сохранение результата
  29.         $name = $_POST['name'] ?: '';
  30.         $score = intval($_POST['score'] ?: 0);
  31.         // Проверка правильности переданных данных
  32.         if (empty($name) || $score == 0) {
  33.             header('HTTP/1.1 400 Bad Request');
  34.             header('Content-Type: application/json;charset=utf-8');
  35.             die('{"error":"Empty required fields: name, score"}');
  36.         }
  37.         $stmt = $pdo->prepare('
  38.            INSERT INTO `hiscore` SET
  39.                `name` = ?,
  40.                `score` = ?,
  41.                `date` = NOW()');
  42.         $stmt->execute([$name, $score]);
  43.         header('HTTP/1.1 200 OK');
  44.         exit;
  45.  
  46.     case 'get':
  47.         // Вывод топ-10 в json
  48.         header('HTTP/1.1 200 OK');
  49.         header('Content-Type: application/json;charset=utf-8');
  50.         $data = $pdo->query('
  51.            SELECT `name`, `score`, `date` FROM `hiscore`
  52.            ORDER BY `score` DESC
  53.            LIMIT 10
  54.        ')->fetchAll();
  55.         echo json_encode($data, JSON_UNESCAPED_UNICODE);
  56.         exit;
  57. }
  58.  
  59. // В остальных случаях выводим результаты на страницу
  60. $stmt = $pdo->query('
  61.    SELECT `name`, `score`, `date` FROM `hiscore`
  62.    ORDER BY `score` DESC
  63.    LIMIT 10
  64. ');
  65. ?>
  66.  
  67. <style>
  68. #content {
  69.   margin: 10px auto;
  70.   font-size: 120%;
  71.   line-height: 150%;
  72.   max-width: 800px;
  73. }
  74. .score {
  75.   width: 100%;
  76.   text-align: center;
  77.   border-collapse: collapse;
  78. }
  79. .score th {
  80.   background: #E0E0E0;
  81. }
  82. .score tr:nth-child(odd) {
  83.     background: #f9f9f9;
  84. }
  85. .score td {
  86.     padding: 5px 0px;
  87. }
  88. </style>
  89. <div id="content">
  90.   <table class="score">
  91.     <thead><tr>
  92.       <th>Место</th><th>Имя</th><th>Результат</th><th>Дата</th>
  93.     </tr></thead>
  94. <?php
  95. $place = 0;
  96. while (list($name, $score, $date) = $stmt->fetch(PDO::FETCH_NUM)) {
  97.     $place++;
  98.     echo '<tr>';
  99.     echo "<td>$place</td><td>$name</td><td>$score</td><td>$date</td>";
  100.     echo '</tr>';
  101. }
  102. ?>
  103.   </table>
  104. </div>
Добавление и вывод таблицы рекордов в формате json и html.
Подключается к базе данных test, создаёт таблицу hiscore и обрабатывает результат.

Если переданы поля action=set, name и score, происходит добавление результата в таблицу. В случае возникновения ошибки, сервер передаёт соответствующий статус-код и текст ошибки в json.

При запросе hiscore.php?action=get, сервер возвращает топ-10 игроков в формате json.

Во всех остальных случаях, выводится таблица рекордов в html.

Реклама

Мы в соцсетях

tw tg yt gt