質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

88.81%

MySQLにある変数だけが受け渡せない

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,250

hideki0227

score 19

zork2.htmlとzork.phpという2つのファイルがあります。
zork2.htmlでのゲームオーバー画面(id="stage100")で、プレイヤーの行動に応じて加算された合計得点(変数points)を表示しています。
そしてプレイヤーの入力するお名前と、合計得点(id="score" name="points" type="hidden")をzork.phpにPOSTします。

「合計得点:」の欄にpointsの値が正常に表示されるので
document.getElementById('treasure_sum').innerHTML = points;
は問題無く動いているようなんですが、
document.getElementById('score').value = points;
が何かおかしいのか、データベースのpointsのレコードには0しか入りません。お名前の値は正常に入っています。
どこが間違っていますでしょうか? どうすれば正しいpointsの値がデータベースのpointsに入りますでしょうか?

zork2.html↓

~略~

<div class="box1" id="stage99">
なんだこの終わり方は……。<br>
お願いです。次回はHAPPY ENDを目指してください!<br>
<br>
<br>
<a href="#stage100" class="gamestart" onclick="sum_treasure();">GAME<br>OVER</a>
</div>

<div class="box1" id="stage100">
ハイスコア登録<br>
<br>
<br>
<br>
<form action="zork.php" method="POST" target="_top">
お名前(20文字以内):<br>
<input type = "text" name = "yourname"><br>
<input id="score" name="points" type="hidden">
<br>
手に入れた宝物:<br>
<div id="treasure_mail">○○        5点</div>
<div id="treasure_key">○○○○      10点</div>
<div id="treasure_asteca">○○○○○○○○  15点</div>
<div id="treasure_memo">○○        20点</div>
<div id="treasure_coffee">○○○○      50点</div>
<br>
合計得点:
<div id="treasure_sum">0</div>
<br>
<input type="submit" value="登録する"><br>
</form>
</div>

~略~

function sum_treasure ()
{
    if (mail === 1)
    {
        points = points + 5;
        document.getElementById('treasure_mail').innerHTML = '手紙        5点';
    }
    if (key === 1)
    {
        points = points + 10;
        document.getElementById('treasure_key').innerHTML = '玄関の鍵      10点';
    }
    if (asteca === 1)
    {
        points = points + 15;
        document.getElementById('treasure_asteca').innerHTML = 'デーモンズリング  15点';
    }
    if (clear === 1)
    {
        points = points + 70;
        document.getElementById('treasure_memo').innerHTML = 'メモ        20点';
        document.getElementById('treasure_coffee').innerHTML = 'コーヒー      50点';
    }

    document.getElementById('treasure_sum').innerHTML = points;
    document.getElementById('score').value = points;
}

~略~

zork.php↓

<?php

/*
//ローカルXAMPPの情報
$host     = '127.0.0.1'; // データベースのホスト名又はIPアドレス
$username = '*****';  // MySQLのユーザ名
$passwd   = '*****';    // MySQLのパスワード
$dbname   = '*****';    // データベース名

$link = mysqli_connect($host, $username, $passwd, $dbname);

$msg = '';
$yourname = '';
$result = array();

// 接続成功した場合
if ($link)
{
    // 文字化け防止
    mysqli_set_charset($link, 'utf8');

    if ($_SERVER['REQUEST_METHOD'] === 'POST')
    {
        if (isset($_POST['yourname']) === TRUE)
        {
            $yourname = $_POST['yourname'];
        }
        $yourname = substr($yourname, 0, 20);

        if (isset($_POST['points']) === TRUE)
        {
            $points = $_POST['points'];
        }

        $query = 'SELECT yourname, points, date FROM zork';
        $result = mysqli_query($link, $query);
        while ($row = mysqli_fetch_array($result))
        {
            /*
            if ($yourname === $row['yourname'])
            {
                $msg = '名前重複';
            }
            */
        }

        if ($msg === '')
        {
            $yourname = htmlspecialchars($yourname, ENT_QUOTES, 'UTF-8');
            $date = date ('Y/m/d');

            $query = 'INSERT INTO zork (yourname, points, date) VALUES ("' . $yourname . '", points, "' . $date . '")';

            $result = mysqli_query($link, $query);

            if ($result === TRUE)
            {
                $msg = '登録しました。ありがとうございました。';
            } else
            {
                $msg = '何らかのエラーで投稿できませんでした。';
            }
        }
    }

?>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title></title>
    <style type="text/css">
        *
        {
            color: #c0ffc0;
        }

        body
        {
            width: 640px;
            margin: 0 auto;
            background-color: #000000;
            font-family:"ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", "メイリオ", Meiryo, Osaka, "MS Pゴシック", "MS PGothic", sans-serif;
            font-size: 22px;
            color: #c0ffc0;
        }

        table
        {
            width: 600px;
            margin: 0 auto;
        }

        th
        {
            word-break: break-all;
            text-align: center;
            vartical-align: top;
            font-size: 16px;
            color: #c0ffc0;
            line-height: 125%;
            border: solid 1px #c0ffc0;
            padding: 5px;
        }

        td
        {
            word-break: break-all;
            text-align: center;
            vartical-align: top;
            font-size: 18px;
            color: #c0ffc0;
            line-height: 125%;
            border: solid 1px #c0ffc0;
            padding: 5px;
        }

        .button_style
        {
            font-size:12px;
            text-decoration:none;
            text-align:center;
            padding:4px;
            color:#c0ffc0;
            background-color:#000000;
            border-radius:5px;
        }

        .dousuru
        {
            display: block;
            width: 100px;
            height: 48px;
            margin: 5px;
            padding: 5px;
            border: 2px solid #c0ffc0;
            border-radius: 15px;
            text-align: center;
            vertical-align: middle;
            clear: both;
        }

        a
        {
            text-decoration: none;
        }
    </style>
</head>
<body>
<?php
    print ($msg . '<br><br>');
?>
<a href="zork.html" target="_top"><span class="dousuru">戻る</span></a><br>
<table>
    <tr>
        <th width = '300'>
        お名前
        </th>
        <th width = '100'>
        得点
        </th>
        <th width = '200'>
        登録日
        </th>
    </tr>
    <tr>
        <?php
            // SELECTクエリを実行する
            $query = 'SELECT yourname, points, date FROM zork ORDER BY points DESC';
            $result = mysqli_query($link, $query);

            // 1行ずつ結果を配列で取得します
            while ($row = mysqli_fetch_array($result))
            {
        ?>
        <td>
            <?php
                print ($row['yourname']);
            ?>
        </td>
        <td>
            <?php
                print ($row['points']);
            ?>
        </td>
        <td>
            <?php
                print ($row['date']);
            ?>
        </td>
    </tr>
    <?php
            }
    ?>
</table>
    <?php
    // 結果セットを開放します
    mysqli_free_result($result);

    // 接続を閉じます
    mysqli_close($link);

// 接続失敗した場合
}
else
{
    print ('何らかのエラーで登録できませんでした。');
}
    ?>
</body>
</html>

イメージ説明
↑15が入ると思いきや、

イメージ説明
↑末尾のレコードでは0です。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+5

$query = 'INSERT INTO zork (yourname, points, date) VALUES ("' . $yourname . '", points, "' . $date . '")';


で、pointsのところに変数$pointsではなくて文字列'points'が直接入っているからかと思います。

全く別問題として、このコードはセキュリティ上とても大きな問題(SQLインジェクション)を抱えているので、インターネットに公開する前にはセキュリティについても十分に勉強されることをお勧めします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/13 23:27

    なるほど、sqlインジェクションは無茶苦茶厄介な問題なんですね。もっと調べてみます。ありがとうございます。

    キャンセル

  • 2016/06/14 00:35

    原理を知って、開発の最初からポリシーを決めて対応すれば実装的には難しい問題ではなくなります。
    SQLインジェクションも含め、webアプリケーションのセキュリティについては、
    IPAの出している
    https://www.ipa.go.jp/security/vuln/websecurity.html
    安全なwebサイトの作り方
    によくまとめられていますので、是非読んでみてください。

    キャンセル

  • 2016/06/14 09:41

    重ねてありがとうございます。のちほどじっくり読ませて頂きます。

    キャンセル

+2

<input id="score" name="points" type="hidden">
ここで、valueを指定していないからでは。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/13 22:51

    まだ正確にはわからないのですが、なぜかintvalしてみたらDBに反映されました。
    ありがとうございます。

    キャンセル

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

  • ただいまの回答率 88.81%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る