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

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

ただいまの
回答率

90.48%

  • PHP

    24459questions

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

  • CSV

    879questions

    CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

phpでラジオボタンを使用した3択クイズを作りたい

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,121

s1522001hs

score 6

前提・実現したいこと

現在、phpとcsvを使って3択クイズを制作しています
csvに問題文、選択肢、正解番号、解説を全て書き込みphpで順番に取り出す処理を行なっています
選択肢はラジオボタンで選択するようにしています
この処理を全て同じphpで行なっています
csv内部

初級第〜回※
挑戦※
問題1|選択肢1,選択肢2,選択肢3|正解番号|解説
問題2|選択肢1,選択肢2,選択肢3|正解番号|解説
⋮(問題は100問)

実現させたいこと
トップページ(html)

問題選択(html)

この問題に挑戦スタート画面(ここからphp)※csv最初の2段はここだけに使う

問題画面(php)1問目は問題文と選択肢のみ、2問目以降は前の解答、問題文、選択肢を表示
↓100問解き終えたら
正解数、全部の解答解説表示

発生している問題・エラーメッセージ

ラジオボタンで送信したの処理がわからず困っています
同じphp内で処理しているため送信した際、次の問題を表示できず一番最初に戻ってしまいます
どのようにしたら次の問題を表示することができますか?

トップページ(html)

問題選択(html)

この問題に挑戦スタート画面(php)

問題画面(php)送信を押しても1問目をループしてしまう
↓全て解き終えたら
正解数、全部の解答解説表示
このソースコードはレッツPHP!様からダウンロードして使わさせていただいています

エラーメッセージ

該当のソースコード

if ($_GET['q']) {
    /* 各質問表示 */
    $qnum = (int)$_GET['q'];
    $tid = (int)$_GET['t'];
    $anum = $_GET['a'];

    // エラー
    if ($qnum == 0 || $tid == 0 || $qnum > 1 && !$anum) {
        err();
    }

    // 答えをセッションに登録
    list($a_qnum, $a_anum) = explode("_", $anum);
    $_SESSION['quiz'][$a_qnum] = $a_anum;

    // 問題を展開
    $line = $dat[$qnum+1];
    list($question, $answers, $anum, $com) = explode("|", $line);
    $ans_arr = explode(",", $answers);

    // 各質問タイトルHTML
    echo <<<Q_TIT
<div style="background: linear-gradient(-45deg, rgba(246, 255, 0, .8), rgba(256, 0, 0, .9));font-size:30px;text-align:center;padding:3px 0 3px 0;">{$title}</div>
<span class="question">Q{$qnum}. {$question}</span><br /><br />

<div class="selection">
Q_TIT;

    echo"<form action='' method='post'>";


    foreach ($ans_arr as $k=>$answer) {
        $num = $k + 1;
        $next = $qnum + 1;
        $qry = (isset($dat[$next+1])) ? "q=".$next : "end=1";
        // 各質問の答え選択HTML
        echo <<<Q_BODY
            <div class="choices">

                <input type='radio' value='".quiz.php?{$qry}&a={$qnum}_{$num}&t={$tid}."' accesskey="{$num}">{$num}. {$answer}

            </div>

Q_BODY;

    }

    echo"<input type='submit' class='btn' value='送信'>";
    echo"</form>";


}
else if ($_GET['end'] == 1) {
    /* 答え合わせと解説 */
    if ($_GET['t'] != $_SESSION['start']) {
        err();
    }
    $lines = array_slice($dat, 2);
    $qcnt = count($lines);

    // 最後の解答追加
    list($a_qnum, $a_anum) = explode("_", $_GET['a']);
    $_SESSION['quiz'][$a_qnum] = $a_anum;

    // 正解数
    foreach ($lines as $k=>$line) {
        $ldat = explode("|", $line);
        if ($ldat[2] == $_SESSION['quiz'][$k+1]) {
            $right++;
        }
    }
    // 正解率
    $per = ceil($right*100 / $qcnt);
    // 得点
    $total = $right * 10;

    // 答え合わせヘッダHTML
    echo <<<Q_END_HEAD
<div style="background: linear-gradient(-45deg, rgba(246, 255, 0, .8), rgba(256, 0, 0, .9));text-align:center;">{$title}</div>

<br />
結果:<span style="color:#ff0000">{$total}点</span>/正解率<span style="color:#ff0000">{$per}%</span><br />
正解数:{$right}/問題数:{$qcnt}<br />
<br />
<br />
    <div>解説</div>
Q_END_HEAD;

    foreach ($lines as $qnumk=>$line) {
        list($question, $ans, $anum, $com) = explode("|", $line);
        $ans_arr = explode(",", $ans);
        $qnum = $qnumk + 1;

        // 答え合わせ各質問HTML
        echo <<<Q_END_S
<span style="color:#663300">Q{$qnum}. {$question}</span><br />
<br />
Q_END_S;

        foreach ($ans_arr as $numk=>$ans) {
            $num = $numk + 1;
            if ($anum == $_SESSION['quiz'][$qnum]) {
                // 正解
                $pre = ($num == $anum) ? '<span style="color:#ff0000">◎</span>' : '&nbsp;&nbsp;';
            }
            else {
                // 不正解
                if ($num == $anum) {
                    $pre = '<span style="color:#ff0000">○</span>';
                }
                elseif ($num == $_SESSION['quiz'][$qnum]) {
                    $pre = '<span style="color:#3366ff">×</span>';
                }
                else {
                    $pre = '&nbsp;&nbsp;';
                }
            }
            // 答え合わせ各解答HTML
            echo <<<Q_END_BODY
{$pre}{$num}. {$ans}<br />
Q_END_BODY;
        }

        // 答え合わせ各質問解説HTML
        echo <<<Q_END_E
<br />{$com}
<br />
<br />
<div style="clear:both;"><hr size="1" /></div>
Q_END_E;
    }
    // 答え合わせフッタHTML
    echo <<<Q_END_FOOT
<div style="text-align:center;">
<a href="quiz.php?">クイズをやり直す</a><br />
</div>
Q_END_FOOT;
    session_destroy();
}
else {
    /* クイズ開始 */
    list($usec, $sec) = explode(" ", microtime());
    $start = $sec;

    // 開始HTML
    echo <<<Q_START
<div style="background: linear-gradient(-45deg, rgba(246, 255, 0, .8), rgba(256, 0, 0, .9));text-align:center;font-size:40px;">{$title}</div>

<br /><div style="text-align:center;">
    <a href="quiz.php?q=1&t={$start}">このクイズに挑戦</a><br />
</div>
Q_START;
    $_SESSION['start'] = $start;
}

/* エラー表示 */
function err() {
    echo <<<ERR
<span style="color:#ff0000">セッションエラーです。初めからやりなおしてください</span><br />
<a href="quiz.php?">クイズをやり直す</a><br />
<br />
<br />
</html>
ERR;
    exit;
}

試したこと

ラジオボタンをつけて選択されていない時の処理は行なうことはできました
ifやactionの使い方がわからずいろんなサイトを見て回ったのですが、解決できず、行き詰まってしまったときこのサイトを知りました
phpは初心者で習ってからまだ半年経っていません
どうかご教授願います

追記

教えていただいたことを調べさせていただきました
hiddenを使い正解を出す処理をしました
送信を押した時答えを表示することができましたが、つぎの問題を表示することができませんでした
どのサイトを見てもactionで別のところに送っていたのでおなじphp内で送ることはできますでしょうか?

echo"<form action='' method='post'>";//追加

    foreach ($ans_arr as $k=>$answer) {
        $num = $k + 1;
        $next = $qnum + 1;
        $qry = (isset($dat[$next+1])) ? "q=".$next : "end=1";

        // 各質問の答え選択HTML
        echo <<<Q_BODY
            <div class="choices">

                <input type="hidden" name="quiz" value="$answer">
                <input type='radio' name='sentaku' value='".quiz.php?{$qry}&a={$qnum}_{$num}&t={$tid}."' accesskey="{$num}">{$num}. {$answer}

            </div>
Q_BODY;
    }
        if(isset($_POST[ 'quiz' ])){
            //隠しフィールドの value を表示する。
            print "$answer";
        }
    echo"<input type='submit' class='btn' value='送信'>";
    echo"</form>";

補足情報(言語/FW/ツール等のバージョンなど)

php csv html

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+1

問題を常に同じ順番で表示するのであればhiddenで現在の問題の番号を
次のページに渡してやればよいでしょう。
出題順番をランダムに行いたい場合は、1問目を出す際に
出題順を決めてセッションに保存しておくなどの仕様が必要になります

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/11/25 11:01

    解答ありがとうございます
    申し訳ございません。作っているクイズは全て同じphp内で処理を行なっているため、actionで送ってあげる次のページがありません
    もし、私の解釈の仕方が間違っていたら誠に申し訳ありません

    キャンセル

  • 2016/11/25 11:20

    ごめんなさい、仕様をうまく理解できてません
    最初の100問は同じページに100問全部だして送ると答えあわせってことですね?
    「この問題に挑戦」も、全部表示すれば1問目に戻る心配はないのでは?
    1問1ページで次のページにいく仕様であれば先程回答したとおりです。

    キャンセル

  • 2016/11/25 11:31

    申し訳ございません質問の仕方が宜しくありませんでした
    問題の出し方は1問1ページで送信した時2問目+1問目の解答という風なページを作りたいと思っております
    hiddenについて勉強させていただきます
    お手数おかけして誠に申し訳ございません
    ありがとうございます

    キャンセル

+1

初心者という事で少し厳しい意見になるかもしれませんが、ifでの作り方(設計?)が分からないことには難しい問題だと思います。

まずは大まかな処理を思い描いて、その為に必要な値や分岐をまとめて下さい。
そうすれば自然と判定しなければいけないものや使う構文などが見えてきます。

同じphp内で処理しているため送信した際、次の問題を表示できず一番最初に戻ってしまいます

という問題に関してはyambejp様の方法が良いと思いますので、そちらを参考に考えてみてはいかがでしょう。

その他の方法としては予め大枠で問題を纏めたブロックを生成し、javascriptを使ってそのボックスを表示・非表示を切り替え、最終的に送信した結果により処理を行うといった方法もあります。

この場合にはユーザーの待ち時間の短縮やサーバーとのやりとりを減らせる等のメリットもありますが、javascriptでの構築の手間やその他付随する問題も出てきますので、まずは慣れている言葉で試されるのが宜しいかと思います。

今はまだ難しい事が多いでしょうが、頑張ってください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/11/25 11:37

    ありがとうございます
    まだまだ勉強不足なので一からまとめて考えていきたいと思います

    キャンセル

0

フォームで選択肢表示して、値を渡して受け取るページで条件処理で答えを表示と次の問題。

選択肢から選んだ回答と正解率などはヒダンで持ち回り、会員制なら別にセッションで会員IDも持ち回りするのが一般的じゃないでしょうか。

セッション管理という方法です。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/11/26 19:00

    プロゲートでPHPコース遊ぶと復習になってイイですよ。

    作り方大体決まってますし、それように開発されてますから。

    キャンセル

  • 2016/11/26 19:03

    因みに作れたら次はエスケープ処理などイタズラ防止措置を施さなければいけなくなります! 頑張って下さい。

    キャンセル

  • 2016/11/28 10:14

    解答ありがとうございます
    セッション管理やプロゲートについて調べさせていただきます
    まだまだ勉強不足ですが頑張らせていただきます

    キャンセル

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

  • PHP

    24459questions

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

  • CSV

    879questions

    CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。