ハイスコア・ランキング

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

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

ハイスコア・ランキング

  1. Data Base を使ってハイスコア・ランキングを記録します。
    本来ならばゲームで高得点を出した場合にハイスコア・ランキングに記録するのでしょうが、今回は Form から得点を入力して記録します。
    事前にサーバー上にハイスコアを記録する Data Base(rank.db)を作成します。
    仮のスコアとして、3件のデータを登録しています。
    Data Base の作成は Data Base を作成 を参照して下さい。
    Table の表示は Data Base 2 を作成 を参照して下さい。
    <html>
    <head><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>
    
  2. 【実行画面】
    '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
  3. Form から得点を入力して、ハイスコアを記録します。
    <html>
    <head><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>
    
  4. 【実行画面】
    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
  5. Form から渡されたパラメータ(pass, id, val)を受け取ります。
    pass はパスワードで、使う必要は無いのですが、サンプルとしてプログラムしてみました。
    $key に現在の日付を設定します。
    ハイスコア・ランキングを管理するキー項目として $key を使います。
        $pass= $_POST['pass'];
        $id= $_POST['id'];
        $val= $_POST['val'];
        $key= date("Y/m/d H:i:s");
    
  6. パスワードを調べて、一致しない時はメッセージを表示します。
    一般的にはパスワードはIDと関連付けて判定します。
    パスワードが一致したときは $key, $id, $val でレコードを追加登録します。
        if (!isset($pass) || $pass!='guest')
        {   print "パスワードを'guest'としてIDと得点を入力して下さい";  }
        else
        {   $db->exec("insert into table1 values(\"$key\", \"$id\", $val)");  }
    
  7. $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;
    
  8. 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>";
            }
    
  9. ベスト10を超えたレコードは削除します。
    $key= $row[key]; で登録日付を取得して delete で削除します。
            else
            {   $key= $row[key];
                $db->exec("delete from table1 where key=\"$key\"");
            }
            $n++;
        }
        print "</table>";
        $db->close();
    ?>
    
  10. 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