プロが教える店舗&オフィスのセキュリティ対策術

多肢選択式試験問題のプログラムを作っています。
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件)

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>]

この回答への補足

すみません。私の質問の書き方が間違っていたようです。
問題用紙のページではきちんと表示されるのですが、採点ページに進むと正解数は分かるのですが、回答者がどの問題を間違えたのか知る必要があるため、問題用紙と同じ表示にしたいのです。

補足日時:2012/05/31 00:56
    • good
    • 0

まず、1題しか出題されない件に関しては、shuffle後にresetしてないためです。


shuffle($arr);
reset($arr);
にすればよいです。

出題された順に表示されない とのことですが、これはちゃんと見るべきかと・・・。
Sessionにはシャッフル以前のデータが入っているので、
表示させたら、それは、そうなるでしょう・・。

foreach($choices as $val){
 print $val;
 // このあたりで$_SESSION[$cnt][]; などに入れないと、ですね。
}
    • good
    • 0

あまり真剣に読んでないのでなんですが



(1)選択肢をよんでくる
(2)シャッフルする
(3)正解番号をセッションにうめこむ
(4)表示
(5)ユーザーが選択してサブミット
(6)セッションデータとサブミットされたデータのマッチングをおこなう

でよいのでは?
1ページに複数の問題を置く場合でも基本的にロジックはかわりません。

この回答への補足

>>yambejpさん

ご回答ありがとうございます。私も理屈では分かっているのですが、具体的にどのようにコードを書けば良いのかがわからないのです。

補足日時:2012/05/30 19:47
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!