多肢選択式試験問題のプログラムを作っています。
MySQLに格納されている各問題と選択肢をシャッフルして出題し、セッションを使って採点ページに進むと出題された問題と選択肢を表示させたいのです。
しかし下記のソースだと問題と選択肢が1題分しか表示されず、選択肢も出題ページに表示された順番には並んでくれません。
これはどうしたらいいのでしょうか?よろしくお願い致します。
//出題のページ ※選択肢Aを選ぶと正解になります。
<?php
session_start();
?>
$arr = array();
while ($row = mysqli_fetch_array($result)){
$arr[] = $row;
}
shuffle($arr);
$cnt = 0;
foreach($arr as $row){
if($cnt >= 2){break;}
print $row['question'];
print "<BR>";
$choices = array();
$choices['a'] = "<INPUT type=radio name=radi_".$cnt." value=a>".$row['choices_a']."<BR>";
$choices['b'] = "<INPUT type=radio name=radi_".$cnt." value=b>".$row['choices_b']."<BR>";
$choices['c'] = "<INPUT type=radio name=radi_".$cnt." value=c>".$row['choices_c']."<BR>";
$choices['d'] = "<INPUT type=radio name=radi_".$cnt." value=d>".$row['choices_d']."<BR>";
session_register(sesdata_q);
session_register(sesdata_a);
session_register(sesdata_b);
session_register(sesdata_c);
session_register(sesdata_d);
$_SESSION[sesdata_q] = $row['question'];
$_SESSION[sesdata_a] = $row['choices_a'];
$_SESSION[sesdata_b] = $row['choices_b'];
$_SESSION[sesdata_c] = $row['choices_c'];
$_SESSION[sesdata_d] = $row['choices_d'];
shuffle($choices);
foreach($choices as $val){
print $val;
}
print "<BR>";
$cnt++;
}
?>
//採点のページ
<?php
$score = 0;
$answer = $_POST['radi_0'];
if($answer == 'a'){
$score++;
}
$answer = $_POST['radi_1'];
if($answer == 'a'){
$score++;
}
$answer = $_POST['radi_2'];
if($answer == 'a'){
$score++;
}
$answer = $_POST['radi_3'];
if($answer == 'a'){
$score++;
}
print "2問中" . $score . "問正解";
print "<br>";
print "<br>";
print $_SESSION[sesdata_q];
print "<br>";
print $_SESSION[sesdata_a];
print "<br>";
print $_SESSION[sesdata_b];
print "<br>";
print $_SESSION[sesdata_c];
print "<br>";
print $_SESSION[sesdata_d];
?>
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
SQLからとってくる部分は省略します。
基本的にとってきた回答の0番目(最初のデータ)が正解とし、
question.phpを質問として、answer.phpが答え合わせだとします
//question.php
<?php
session_start();
$q=array(
array("q"=>"問題文1","a"=>array("a1","b1","c1","d1"))
,array("q"=>"問題文2","a"=>array("a2","b2","c2","d2"))
,array("q"=>"問題文3","a"=>array("a3","b3","c3","d2"))
,array("q"=>"問題文4","a"=>array("a4","b4","c4","d4"))
);
?>
<form action="answer.php">
<?PHP
$count=0;
foreach($q as $key=>$array){
$_SESSION["a"][$key]=$array["a"][0];
shuffle($array["a"]);
print "問題".($count+1).")".$array["q"]."<br>\n";
foreach($array["a"] as $key2=>$val){
print "<input type=\"radio\" name=\"q[".$count."]\" value=\"".$val."\">".$val;
}
print "<br>\n";
$count++;
}
?>
<input type="submit" value="go">
</form>
//answer.php
<?PHP
session_start();
$a=$_SESSION["a"];
$q=$_REQUEST["q"];
$seikai=0;
foreach($a as $key=>$val){
if($val===$q[$key]) $seikai++;
}
print "正解数は".$seikai."問です<br>\n";
?>
[ <a href="question.php">戻る</a>]
この回答への補足
すみません。私の質問の書き方が間違っていたようです。
問題用紙のページではきちんと表示されるのですが、採点ページに進むと正解数は分かるのですが、回答者がどの問題を間違えたのか知る必要があるため、問題用紙と同じ表示にしたいのです。
No.2
- 回答日時:
まず、1題しか出題されない件に関しては、shuffle後にresetしてないためです。
shuffle($arr);
reset($arr);
にすればよいです。
出題された順に表示されない とのことですが、これはちゃんと見るべきかと・・・。
Sessionにはシャッフル以前のデータが入っているので、
表示させたら、それは、そうなるでしょう・・。
foreach($choices as $val){
print $val;
// このあたりで$_SESSION[$cnt][]; などに入れないと、ですね。
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- JavaScript セレクトボックスを2つ選択してメッセージなどを表示するには。~運賃検索プログラムを完成させたい~ 1 2022/07/22 11:10
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- PHP PHP MySql ページング 2 2022/09/20 06:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
POSTで渡されるデータの数がわ...
-
PHPでこのコード自体に意味は無...
-
foreachとかの勝手な省略?
-
Smartyでインクリメント
-
VB.NET で 二次元のハッシュは...
-
PHP、{}記号の意味
-
PHPでテキストファイルを読み込...
-
多次元配列を、1次元の配列にす...
-
ラジオボタンをランダムに表示...
-
foreachで上限回数指定方法また...
-
file_existsでファイル名の部分...
-
プルダウンメニューにDBの内容...
-
特定の文からメールアドレスの...
-
行数が30万件ほどあるCSVから、...
-
複数行のデータのPOST処理に関して
-
チェックボックス複数選択 mys...
-
日付、時間の2段階でソート
-
スカラーのベクトル微分
-
別ファイルの構造体の値を読み...
-
foreachのなかで次のキーを参照...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
smartyのforeachの使い方
-
マッチング処理(1:N)
-
foreachで上限回数指定方法また...
-
多次元配列を、1次元の配列にす...
-
foreachの間にテーブルの<TR>を...
-
PHP、{}記号の意味
-
VB.NET で 二次元のハッシュは...
-
$_POST受信で必要項目のみを結...
-
3つの連想配列を交互に代入し...
-
PHP:ツリー構造をulとli要素に...
-
foreachで配列を、左から縦3列...
-
PHPの構文で間違えが分からない
-
PHPで連想配列のプルダウンメニ...
-
添え字が全て文字列のPHPの多次...
-
テーブルデータ表示
-
Smartyでインクリメント
-
PHPで変数名にハイフンを使うに...
-
POSTで渡されるデータの数がわ...
-
Delphi XEの警告文を消したい
-
配列の要素の値をループ中に変...
おすすめ情報