teratail header banner
teratail header banner
質問するログイン新規登録
PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

478閲覧

PDOで対象データの値が上位10位以内に入る場合のみデータベースにinsertする方法を教えてください

Luca

総合スコア1

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2023/06/24 07:13

0

0

実現したいこと

  • 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)

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

同じスコアがある場合どうしたいかによります
また新らたにベスト10に入ってきたときそれまでの10位のデータは消すのでしょうか?

もしそうなら単純に、常にデータを追加して、11位(11以下)のデータを削除するだけでよいでしょう

投稿2023/06/24 14:02

yambejp

総合スコア117914

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

この回答はGPT-4による自動生成回答です

addScore.phpで、送信されたスコアが上位10位以内に入るかどうかをチェックするために、以下の手順を実行します。

  1. データベースから上位10位のスコアを取得します。
  2. 送信されたスコアが上位10位の中に入るかどうかを確認します。
  3. スコアが上位10位に入る場合は、データベースに追加し、rankin.htmlにリダイレクトします。そうでない場合は、rankout.htmlにリダイレクトします。

以下に、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 11 // 1. データベースから上位10位のスコアを取得 12 $sql = "SELECT score FROM scoreboard ORDER BY score DESC LIMIT 10"; 13 $statement = $conn->prepare($sql); 14 $statement->execute(); 15 $top_scores = $statement->fetchAll(PDO::FETCH_COLUMN, 0); 16 17 // 2. 送信されたスコアが上位10位の中に入るかどうかを確認 18 $submitted_score = intval($_GET['score']); 19 $is_in_top10 = count($top_scores) < 10 || $submitted_score > min($top_scores); 20 21 // 3. スコアが上位10位に入る場合は、データベースに追加し、rankin.htmlにリダイレクト 22 if ($is_in_top10) { 23 $statement = $conn->prepare("INSERT INTO scoreboard (name, score, stamp) VALUES (?, ?, ?)"); 24 $statement->execute(array($_GET['name'], $_GET['score'], $_GET['stamp'])); 25 header('Location: rankin.html'); 26 } else { 27 // そうでない場合は、rankout.htmlにリダイレクト 28 header('Location: rankout.html'); 29 } 30} 31catch(PDOException $e) 32{ 33 header('Location: rankout.html'); 34} 35 36$conn = null; 37?>

この修正により、送信されたスコアが上位10位に入る場合のみデータベースに追加され、そうでない場合はrankout.htmlにリダイレクトされるようになります。

投稿2023/06/24 07:14

teratail-ai

Powered by GPT-4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問