ハイスコア・ランキング

Data Base にハイスコア・ランキングを記録します。

ハイスコア・ランキングのプログラムを呼び出すコードです。
<a href="http://maedakobe.rw.xsi.jp/php/rank.php">ハイスコア・ランキング</a>
次のリンクをクリックするとハイスコア・ランキングが呼び出されます。
ハイスコア・ランキング

ハイスコア・ランキング

  1. Data Base を使ってハイスコア・ランキングを記録します。
    本来ならばゲームで高得点を出した場合にハイスコア・ランキングに記録するのでしょうが、今回は Form から得点を入力して記録します。
    事前にサーバー上にハイスコアを記録する Data Base(rank.db)を作成します。
    仮のスコアとして、3件のデータを登録しています。
    rank.db を作成 をクリックすると rank.db が存在すれば表示されます。
    rank.db を初期化するときは、サーバーから削除してから実行して下さい。
    Data Base の作成は Data Base を作成 を参考にして下さい。
    Table の表示は Data Base 2 を作成 を参考にして下さい。
  2. rank.db を作成する dbrank.php のソースコードです。
    <html>
    <head>
    <meta charset="UTF-8">
    <title>rank.db の作成</title>
    </head>
    <body>
    <?php
        $flag = file_exists('rank.db');
        $db = new SQLite3('rank.db');
        if ($flag==false)
        {  //table1 にデータを登録
           $db->exec('create table table1 (key, id, val)');
           $db->exec("insert into table1 values('2015/04/01 9:00:00', 'AA', 1)");
           $db->exec("insert into table1 values('2015/04/01 10:00:00', 'BB', 2)");
           $db->exec("insert into table1 values('2015/04/01 20:00:00', 'CC', 3)");
        }
        //データを表示
        $results = $db->query('SELECT * FROM table1');
        print "<table border='1'>";
        while($row = $results->fetchArray())
        {   print "<tr><td>$row[id]</td>";
            print "<td>$row[val]</td>";
            print "<td>$row[key]</td></tr>";
        }
        print "</table>";
        $db->close();
    ?>
    </body>
    </html>
    
  3. 【実行画面】
    'rank.db' を作成したときの画面です。
    AA 1 2015/04/01 9:00:00
    BB 2 2015/04/01 10:00:00
    CC 3 2015/04/01 20:00:00
  4. Form から得点を入力して、ハイスコアを記録する rank.php です。
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Ranking</title>
    </head>
    <body>
    <?php
        $pass= $_POST['pass'];
        $id= $_POST['id'];
        $val= $_POST['val'];
        $key= date("Y/m/d H:i:s");
        $db = new SQLite3('rank.db');
        if (!isset($pass) || $pass!='guest')
        {   print "パスワードを'guest'としてIDと得点を入力して下さい";  }
        else
        {   $db->exec("insert into table1 values(\"$key\", \"$id\", $val)");  }
        $results = $db->query('SELECT * FROM table1 ORDER BY val DESC');
        print "<table border='1'>";
        print "<tr><th>順位</th><th>ID</th><th>得点</th><th>日付</th></tr>";
        $n= 1;
        while($row = $results->fetchArray())
        {   if ($n<11)
            {   print "<tr><td>$n 位</td>";
                print "<td>$row[id]</td>";
                print "<td>$row[val]</td>";
                print "<td>$row[key]</td></tr>";
            }
            else
            {   $key= $row[key];
                $db->exec("delete from table1 where key=\"$key\"");
            }
            $n++;
        }
        print "</table>";
        $db->close();
    ?>
        <form action="rank.php" method="post">
          パスワード: <input type="password" name="pass">
          ID: <input type="text" name="id">
          得点: <input type="text" name="val">
          <input type="submit">
        </form>
    </body>
    </html>
    
  5. 【実行画面】
    DD, 5 を追加したときの画面です。
    順位ID得点日付
    1 位DD 5 2015/04/15 10:59:29
    2 位CC 3 2015/04/01 20:00:00
    3 位BB 2 2015/04/01 10:00:00
    4 位AA 1 2015/04/01 9:00:00
  6. Form から渡されたパラメータ(pass, id, val)を受け取ります。
    pass はパスワードで、使う必要は無いのですが、サンプルとしてプログラムしてみました。
    $key に現在の日付を設定します。
    ハイスコア・ランキングを管理するキー項目として $key を使います。
        $pass= $_POST['pass'];
        $id= $_POST['id'];
        $val= $_POST['val'];
        $key= date("Y/m/d H:i:s");
    
  7. パスワードを調べて、一致しない時はメッセージを表示します。
    一般的にはパスワードはIDと関連付けて判定するのですが、今回は 'guest' を使います。
    パスワードが一致したときは $key, $id, $val でレコードを追加登録します。
        if (!isset($pass) || $pass!='guest')
        {   print "パスワードを'guest'としてIDと得点を入力して下さい";  }
        else
        {   $db->exec("insert into table1 values(\"$key\", \"$id\", $val)");  }
    
  8. $results = $db->query('SELECT * FROM table1 ORDER BY val DESC'); で得点の大きい順に並べます。
    table に見出しを設定して表示の開始です。
        $results = $db->query('SELECT * FROM table1 ORDER BY val DESC');
        print "<table border='1'>";
        print "<tr><th>順位</th><th>ID</th><th>得点</th><th>日付</th></tr>";
        $n= 1;
    
  9. 10位までは table に並べて表示します。
        while($row = $results->fetchArray())
        {   if ($n<11)
            {   print "<tr><td>$n 位</td>";
                print "<td>$row[id]</td>";
                print "<td>$row[val]</td>";
                print "<td>$row[key]</td></tr>";
            }
    
  10. ベスト10を超えたレコードは削除します。
    $key= $row[key]; で登録日付を取得して delete で削除します。
            else
            {   $key= $row[key];
                $db->exec("delete from table1 where key=\"$key\"");
            }
            $n++;
        }
        print "</table>";
        $db->close();
    ?>
    
  11. Form から input type="password" でパスワードを入力します。
    "password" を設定するとタイプした文字が * に置き換わり隠されます。
        <form action="rank.php" method="post">
          パスワード: <input type="password" name="pass">
          ID: <input type="text" name="id">
          得点: <input type="text" name="val">
          <input type="submit">
        </form>
    

前田稔の超初心者のプログラム入門
PHP Program