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

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

新規登録して質問してみよう
ただいま回答率
85.50%
CSV

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

PHP

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

Q&A

解決済

3回答

6742閲覧

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

s1522001hs

総合スコア12

CSV

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

PHP

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

0グッド

0クリップ

投稿2016/11/25 01:28

編集2016/11/30 01:05

###前提・実現したいこと
現在、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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

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

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

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

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

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

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

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

投稿2016/11/25 02:27

nobinobi

総合スコア199

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

s1522001hs

2016/11/25 02:37

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

0

ベストアンサー

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

投稿2016/11/25 01:38

yambejp

総合スコア114572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

s1522001hs

2016/11/25 02:01

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

2016/11/25 02:20

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

2016/11/25 02:31

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

0

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

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

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

投稿2016/11/26 09:56

KatsukiSugiura

総合スコア335

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KatsukiSugiura

2016/11/26 10:00

プロゲートでPHPコース遊ぶと復習になってイイですよ。 作り方大体決まってますし、それように開発されてますから。
KatsukiSugiura

2016/11/26 10:03

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

2016/11/28 01:14

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問