実現したいこと
- PHPを使って簡単なスコアボード機能を実装したいと考えています。
- データ数が増え続けないよう、また表示内容をシンプルにするため、投稿された「score」パラメータの値が登録済みデータの上位10つ以内に入る場合のみ送信されるように設定したいです。
- スコア送信・表示機能は既に実現できていますが、スコアが何位でも送信されてしまう状況です。
前提
PHPを使って簡単なスコアボード(ランキング)機能を実装したいと考えています。
現在、単純に「データベース内にテーブルを作成してスコアボードの本体を用意する」(setup.php)・「スコアを送信する」(addScore.php)・「1位から10位までのランキングを表示する(getScore.php)という機能は実現できているのですが、送信されたスコアが何位であっても送信されてしまう状態で、データ数がすぐに増えていってしまう恐れがあります。
そこで「addScore.php」でスコアをinsertする際に初めから10位以内に入るデータのみをフィルタリングし、その他のスコアは追加せず「rankout.html」にリダイレクトさせたいと思っているのですが、独学でPHPを勉強し始めたばかりの初心者で、上手く実装することができません。
何方か、教えて頂けると幸いです。
発生している問題・エラーメッセージ
スコアの送信自体は問題なく行われているため、エラーは発生していません。
該当のソースコード
「setup.php」(スコアボードテーブルの作成):
PHP
1<?php 2$servername = "mysql000.xxx.xxx.lan"; 3$username = "username"; 4$password = "password"; 5$dbname = "databasename"; 6 7echo "<h1>スコアボード</h1>"; 8 9echo "スコアボード作成中...<br>"; 10 11try 12{ 13 $conn = new PDO("mysql:host=$servername;dbname=$dbname", 14 $username, $password); 15 16 $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 17 18 $sql = "CREATE TABLE scoreboard ( 19 name VARCHAR(30) NOT NULL, 20 score INT(6) NOT NULL, 21 stamp INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY 22 )"; 23 24 $conn->exec($sql); 25 echo "<p>スコアボード作成に成功しました。"; 26} 27catch(PDOException $e) 28{ 29 echo $sql . " 30" . $e->getMessage(); 31} 32 33$conn = null; 34?>
「addScore.php」(スコア送信):
PHP
1<?php 2$servername = "mysql000.xxx.xxx.lan"; 3$username = "username"; 4$password = "password"; 5$dbname = "databasename"; 6 7try 8{ 9 $conn = new PDO('mysql:host=' . $servername . ';dbname=' . $dbname , $username, $password); 10 $statement = $conn->prepare("INSERT INTO scoreboard (name, score, stamp) VALUES (?, ?, ?)"); 11 $statement->execute(array($_GET['name'], $_GET['score'], $_GET['stamp'])); 12 13 header('Location: rankin.html'); 14} 15catch(PDOException $e) 16{ 17 header('Location: rankout.html'); 18} 19 20$conn = null; 21?>
「getScore.php」(スコア取得・表示):
PHP
1<?php 2$servername = "mysql000.xxx.xxx.lan"; 3$username = "username"; 4$password = "password"; 5$dbname = "databasename"; 6 7echo "<h1>スコアランキングTOP10</h1>"; 8echo "<ol id=\"top10\">"; 9try 10{ 11 $conn = new mysqli($servername, $username, $password, $dbname); 12 $sql = "SELECT name, score FROM scoreboard ORDER BY score DESC LIMIT 0, 10"; 13 $result = $conn->query($sql); 14 if ($result->num_rows > 0) 15 { 16 while($row = $result->fetch_assoc()) 17 { 18 echo "<li>" . $row["name"]. ": " . $row["score"]. "点</li>"; 19 } 20 } else 21 { 22 echo "<li>スコアが登録されていません。</li>"; 23 } 24 echo "</ol>"; 25 $conn->close(); 26} 27catch(PDOException $e) 28{ 29 echo $statement . " 30" . $e->getMessage(); 31} 32$conn = null; 33?>
補足情報(FW/ツールのバージョンなど)
- PHPのバージョン: 8.2
- データベース: MySQL(バージョン5.7)
よろしくお願いします。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。