###前提・実現したいこと
現在、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>' : ' '; } else { // 不正解 if ($num == $anum) { $pre = '<span style="color:#ff0000">○</span>'; } elseif ($num == $_SESSION['quiz'][$qnum]) { $pre = '<span style="color:#3366ff">×</span>'; } else { $pre = ' '; } } // 答え合わせ各解答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
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/25 02:37